关于哈希表查找不成功时的平均查找长度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于哈希表查找不成功时的平均查找长度相关的知识,希望对你有一定的参考价值。

我找了很多,产生了一个疑问:
假设:
哈希表长为:16(0~15)
哈希函数为:h(key)=key mod 13
构造哈希表为:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
14 1 68 27 55 19 20 84 79 23 11 10
那么查找不成功时的ASL是计算的是0~15每个哈希地址查找不成功的比较次数
问题是:h(key)=key mod 13 第一次 的值只可能是0~12(也就是说第一次用哈希函数求得的地址不可能是13~15),那计算13,14,15查找不成功的比较次数是为什么?
我找到了这个http://blog.sina.com.cn/s/blog_6c37da0901017bcj.html,感觉老师讲的有错误
不应该再求查找不成功时ASL除以表长(16),应该是0~12的查找不成功比较次数,并且除以13,
希望得到权威的回答唉...

参考技术A 我感觉你可能并没有仔细看那个博客上的讲解,实际上你的理解是对的,而博客上也是那样讲的。博客上是这样说的:
“求查找不成功时的平均查找长度,一般情况下分母为表长,但精确地讲是表长的有效位个数”
(红字部分)

注意这里的表长其实就是你说的16,而有效位个数其实就是12,博客随后还举了个字母表的例子进一步说明这个问题。
计算不成功AVL时,一定是依据具体hash函数计算的,正如你所言,虽然表长为16,但实际查找时最初只可能产生0-12一共13种结果,所以应该除的是13,你的理解是正确的。

有问题欢迎继续讨论。本回答被提问者采纳

七大查找算法

顺序查找,二分查找,插值查找,斐比那契查找,数表查找,分块查找,哈希查找。

平均查找长度(Average Search Length,ASL):需和指定key进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度

1、顺序查找

/**
平均查找长度:ASL=(1+2+3+...+n)/n=(n+1)/2;
顺序查找:时间复杂度O(n);
**/
int
SequenceSearch(int a[],int value,int n){ for(int i=0;i<n;i++){ if(A[i] == value){ return i; } } return -1; }

2、二分查找

//二分查找,遍历
int
BinarySearch(int a[],int value,int n){ int low,high,mid; low = 0; high = n-1; while (low<high) { mid = (low+high)/2; if(a[mid] == n){ return mid; }else if(a[mid] > n){ high = mid - 1; }else{ low = mid + 1; } } return -1; }
//二分查找,递归版本

 

3、插值查找

4、斐比那契查找

5、数表查找

6、分块查找

7、哈希查找

以上是关于关于哈希表查找不成功时的平均查找长度的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 平均查找长度

哈希表之四查找及分析

七大查找算法

数据结构第九十章期末复习

数据结构哈希表,求大神,急急急

哈希表详解