哈希表查找 平均查找长度 解析

       哈希表的装填因子 α 的定义如下:

                α = 哈希表中元素个数 / 哈希表的长度

       α 可描述哈希表的装满程度。显然,α 越小,发生冲突的可能性越小,而 α 越大,发生冲突的可能性也越大

手工计算等概率情况下查找 成功 的平均查找长度公式

       规则如下:

ASLsucc 

       其中 C为置入每个元素时所需的比较次数
       
例如:已知一组关键字序列(191423016820842755111079)按哈希函数H(key)=key % 13 和线性探测处理冲突构造所得哈希表ht[0..15],如图1所示

比较次数1     2      1      4      3      1      1     3     9      1      1     3

       查找19时,通过计算H(19)= 6,ht[6].key非空且值为19查找成功,则查找关键字19 ,仅需要计算1次地址就可以找到;

       查找14时,通过计算H(14)= 1,ht[1].key非空且值为14查找成功,则查找关键字19 ,仅需要计算1次地址就可以找到;

       查找23时,通过计算H(23)=10,ht[10].key非空且值为23查找成功,则查找关键字23 ,仅需要计算1次地址就可以找到;

       同样,查找关键字68,20,11,均需要计算一次地址就可以找到;

       查找关键字01时,通过计算H(01)=1,ht[1].key非空且值为14≠01,则找第一次冲突处理后的地址H1=(1+1)% 13=2,此时,ht[2].key非空且值为01,查找成功因此查找关键字01时,需要计算2次地址才可以找到;

       查找关键字55时,通过计算H(55)=3,ht[3].key非空且值为68≠55,则找第一次冲突处理后的地址H1=(3+1)% 13=4,此时,ht[4].key非空且值为27≠55,则找第二次冲突后处理地址H2=(3+2)% 13=5, ht[5].key非空且值为55查找成功,因此查找关键字27时,需要计算3次地址才能找到,同理,查找关键字10,84均需要计算3次地址才能找到;

       查找关键字27时,通过计算H(27)=1,ht[1].key非空且值为14≠27,则找第一次冲突处理后的地址H1=(1+1)% 13=2,此时,ht[2].key非空且值为01≠27,则找第二次冲突后处理地址H2=(1+2)% 13=3, ht[3].key非空且值为68≠27,则找第三次冲突后处理地址H3=(1+3)% 13=4,ht[4].key非空且值为27,查找成功,因此查找关键字27时,需要计算4次地址才可以找到;

       根据上面的方法,查找关键字79时,通过计算H(79)=1,ht[1].key非空且值为14≠79,则找第一次冲突处理后的地址H1=(1+1)% 13=2,此时,ht[2].key非空且值为01≠79,则找第二次冲突后处理地址H2=(1+2)% 13=3, ht[3].key非空且值为68≠79,则找第三次冲突后处理地址H3=(1+3)% 13=4,ht[4].key非空且值为27≠79,则找第四次冲突后处理地址H4=(1+4)% 13=5,ht[5].key非空且值为55≠79,则找第五次冲突后处理地址H5=(1+5)% 13=6,ht[6].key非空且值为19≠79则找第六次冲突后处理地址H6=(1+6)% 13=7,ht[7].key非空且值为20≠79,则找第七次冲突后处理地址H7=(1+7)% 13=8,ht[8].key非空且值为84≠79,则找第八次冲突后处理地址H8=(1+8)% 13=9,ht[9].key非空且值为79,查找成功,因此查找关键字79时,需要计算9次地址才可以找到。

       据此计算公式,对如图8.27的哈希表,采用线性探测再散列法处理冲突, 计算出在等概率查找的情况下其查找成功的平均查找长度为:

ASL(12)==2.5

       为便于计算, 在图8.27哈希表下方加注圆圈, 圆圈内表示的是有冲突时的计算次数, 如代表需要一次地址计算就可找到的关键字有6个,依此类推,即可得到计算结果。

同理据此公式, 对采用链地址法处理冲突的哈希表例图8.26, 计算出在等概率情况下其查找成功的平均查找长度为:

ASL(12)succ=

 

手工计算在等概率情况下查找 不成功 的平均查找长度公式

查找不成功的情况:(1)  遇到空单元

                               (2)  按解决冲突的方法完全探测一遍后仍未找到。0 -> r-1 个不成功查找的入口,从每个入口进入后,直到确定查找不成功为止,其关键字的比较次数就是与该入口对应的不成功查找长度。

       

规则如下:

ASLunsucc 

       其中Ci为函数取值为 i 时确定查找不成功时比较次数

       据此计算公式,对如图8.27的哈希表,采用线性探测再散列法处理冲突, 计算出在等概率查找的情况下其查找不成功的平均查找长度为:

ASL(13)==6

       同理据此公式,对采用链地址法处理冲突的哈希表例图8.26, 计算出在等概率情况下其查找不成功的平均查找长度为:

ASL(13)unsucc=

链地址法:

 











  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是按照您要求的完整代码。在这里,我们使用了动态数组来存储整数数据,并通过 `fgets()` 函数读取输入,使用 `strtok()` 函数来解析字符串中的整数。同时,我们将构造哈希表、插入数据和搜索数据的过程都封装在函数中,以便于调用。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define M 16 int hash(int key) { return key % 13; } int search(int table[], int key, int *count) { int index = hash(key); int i = 0, j; while (i < M) { j = (index + i) % M; (*count)++; if (table[j] == key) { printf("查找成功,关键字 %d 在哈希表中的位置为 %d\n", key, j); return j; } else if (table[j] == -1) { printf("查找失败,关键字 %d 不在哈希表中\n", key); return -1; } i++; } printf("查找失败,关键字 %d 不在哈希表中\n", key); return -1; } int *create_table() { int *table = (int *)malloc(M * sizeof(int)); int i; for (i = 0; i < M; i++) table[i] = -1; return table; } void insert_data(int table[]) { char buffer[100]; char *token; int key; fgets(buffer, 100, stdin); token = strtok(buffer, " "); while (token != NULL) { key = atoi(token); table[hash(key)] = key; token = strtok(NULL, " "); } } int main() { int *table = create_table(); int i, key, count = 0; insert_data(table); scanf("%d", &key); search(table, key, &count); printf("比较次数:%d\n", count); free(table); return 0; } ``` 在上述代码中,我们定义了 `create_table()` 函数用于动态创建哈希表,`insert_data()` 函数用于读取输入并插入数据到哈希表中。在 `main()` 函数中,我们先调用 `create_table()` 函数创建一个哈希表,然后调用 `insert_data()` 函数读取输入并插入数据。最后,我们从标准输入中读取查询关键字 `key`,并调用 `search()` 函数搜索数据并输出比较次数,最后释放哈希表的内存空间。 注意,在使用哈希表时,需要考虑数据的分布情况,尽量避免冲突的发生,从而提高查找效率。同时,需要注意动态数组的内存管理,避免内存泄漏的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值