- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第1章 查找表;;2.对查找表经常进行的操作;仅作查询和检索操作的查找表。;1.1 静 态 查 找 表;1、顺序表的查找;L;顺序表的查找运算;顺序表的按内容查找;算法实现:;typedef struct {
// 数据元素存储空间基址,建表时
按实际长度分配,0号单元留空
int length; // 表的长度
} SSTable;;i;ST.elem;int Search_Seq(SSTable ST,
KeyType key) {
// 在顺序表ST中顺序查找其关键字等于
// key的数据元素。若找到,则函数值为
// 该元素在表中的位置,否则为0。
ST.elem[0].key = key; // “哨兵”
for (i=ST.length; ST.elem[i].key!=key; --i);
// 从后往前找
return i; // 找不到时,i为0
} // Search_Seq;2、有序表的查找; 上述顺序查找算法实现简单,但不适用于表长较大的查找表。;int Search_Bin ( SSTable ST, KeyType key ) {
low = 1; high = ST.length; // 置区间初值
while (low = high) {
mid = (low + high) / 2;
if (EQ (key , ST.elem[mid].key) ) // ==
return mid; // 找到待查元素
else if ( LT (key , ST.elem[mid].key) ) //
high = mid - 1; // 继续在前半区间进行查找
else low = mid + 1; // 继续在后半区间进行查找
}
return 0; // 顺序表中不存在待查元素
} // Search_Bin;算法描述;例 ;查找过程:将表分成几块,块内无序,块间有序;先确定待查元素所在块,再在块内查找
适用条件:分块有序表
算法实现
用数组存放待查元素,每个数据元素至少含有关键字域
建立索引表,每个索引表结点含有最大关键字域和指向本块第一个结点的指针;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18;ASL;1.2 动态查找表;(1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值;;50;2.二叉排序树的查找算法;50;从上述查找过程可见:;根据动态查找表的定义,“插入”操作在查找不成功时才进行;;30;45;(1)被删除的结点是叶子;;50;50;50;50;二、平衡二叉树;如何构建一棵平衡二叉排序树?;构造平衡二叉树的方法: 插入、判断、平衡旋转;构造平衡二叉树的方法: 插入、判断、平衡旋转;构造平衡二叉树的方法: 插入、判断、平衡旋转;;例2: 依次插入的关键字为5, 4, 2, 8, 6, 9;4; 一、哈希表是什么?;一、哈希表是什么?;哈希表:即散列存储结构。
散列法存储的基本思想:建立关键码字与其存储位置的对应关系,或者说,由关键码的值决定数据的存储地址。
优点:查找速度极快(O(1)),查找效率与元素个数n无关!;选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行比较,确定查找是否成功。;有6个元素的关键码分别为:(14,23,39,9,25,11)。
选取关键码与元素位置间的函数为H(k)=k mod 7;二、构造哈希函数的方法;哈希函数为关键字的线性函数
H(key) = key 或者
H(key) = a ? key + b;此方法仅适合于:
能预先估计出全体关键字的每一位上各种数字出现的频度。; 以关键字的平方值的中间几位作为存储地址。求“关键字的平方值” 的目的是“扩大差别” ,同时平方值的中间各位又能受到整个关键字中各位的影响。; 将关键字分割成若干部分,然后取它们的叠加和为哈希地址。有两种叠加处理
文档评论(0)