第九章 查找 查找的概念 顺序表查找 索引查找 散列查找 性能分析 例:数据元素个数n 80, 哈希表长m 100,关键字为八位十进制数, 其中部分关键字如下: 8 1 3 4 6 5 3 2 8 1 3 7 2 2 4 2 8 1 3 8 7 4 2 2 8 1 3 0 1 3 6 7 8 1 3 2 2 8 1 7 8 1 3 3 8 9 6 7 8 1 3 5 4 1 5 7 8 1 3 6 8 5 3 7 8 1 4 1 9 3 5 5 ... ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ 只有④⑤⑥⑦位出现的数字分布均匀,因此可取其中任意两位作为哈希地址。 冲突:不同的关键字若得到同一个散列地址,这种现象称为冲突。 同义词:把具有不同关键字,但具有相同散列地址的元素称为同义词。 桶: 每个散列地址对应的存储空间,一个桶可以是一个单元,存储一个元素,也可以是多个单元,存储多个元素。 冲突一般不可避免,因为关键字的取值范围通常远远大于散列地址的空间。如何尽量避免冲突?发生冲突后如何处理冲突?是散列存储的两个关键问题。 与冲突发生可能性大小有关的三个主要因素: (1)装填因子 а n/m n : Hash表中元素个数 m : Hash表地址空间大小 а越小,冲突可能性也越小;但是,а越小,空间利用率越低。这是一个矛盾,可根据实际情况取舍。经验证明一般а控制在0.6—0.9之间较好。 (2)与采用的Hash函数有关,尽可能均匀分布。 (3)与解决冲突的方法有关。 二、散列函数的构造方法 对数字关键字可有下列构造方法: 直接定址法 除留余数法 数字分析法 平方取中法 折叠法 若是非数字关键字,则需先对其进行数字化处理。 什么是好的散列函数? 均匀的散列函数:对于关键字集合中的任一关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的。 哈希函数为关键字的线性函数 H key key 或者 H key a ? key + b 其中a和b为常数 此法不会发生冲突,但此法仅适合于: 地址集合的大小 关键字集合的大小 实际中能使用这种哈希函数的情况较少。 1. 直接定址法 2. 除留余数法 取关键字被哈希表表长 m 除后所得的余数作为哈希地址。即: H key key MOD m 其中, m为散列表表长 关键:对 m 的选择。实践证明 m 为素数比较好。 除留余数法计算简单,适用范围广,是最常用的一种方法。 给定一组关键字为: 12, 39, 18, 24, 33, 21, 若取 m 9, 则他们对应的哈希函数值将为: 3, 3, 0, 6, 6, 3 可见,若 m 中含质因子 3, 则所有含质因子 3 的关键字均映射到“3 的倍数”的地址上,从而增加了“冲突”的可能。 例如: 为什么要对 m 加限制? 当关键字为字符串时,需先转换成整数,再应用上述函数。 例如:下列函数先把字符串 K 转换为一个整数 h,再应用除留余数法求散列地址。 int Hash char *K, int m int len strlen K ; unsigned int h 0; for int i 0; i len; i++ h 3; h+ K[i]; return h%m; 3. 数字分析法 假设关键字集合中的每个关键字都是由 s 位数字组成 u1, u2, …, us ,则可分析全体关键字, 并从中提取分布均匀的若干位组成散列地址。 此法适用于能预先估计出全体关键字的每一位上各种数字出现的频度的情况。 以关键字的平方值的中间几位作为存储地址。 求“关键字的平方值” 的目的是“扩大差别” ,同时平方值的中间各位又能受到整个关键字中各位的影响。 此方法适用于: 关键字中的每一位都有某些数字重复出现频度很高的现象,即取值不够分散的情况。 4. 平方取中法 5. 折叠法 例: 关键字为 :0座机电话号码4,哈希地址位数为4 5 8 6 4 4 2 2 0 0 4 1 0 0 8 8 H key 0088 移位叠加 5 8 6 4 0 2 2 4 0 4 6 0 9 2 H key 6092 间界叠加 将关键字分割成位数相同的几段,然后取它们的叠加和为哈希地址。 两种叠加处理的方法: 移位叠加:将分割后的几段低位对齐相加 间界叠加:从一端沿分割界来回折送,然后对齐相加 此法适于:关键字的位数较多,每一位取值又较集中 “处理冲突” 的实际含义是: 为产生冲突的记录寻找下一个“空”的哈希地址。 开放定址法 链接法 三、处理冲突的
原创力文档

文档评论(0)