设有一组关键字(9,01,23,14,55,20,84,27),采用哈希函数:h(key)=key %7 ,表长为10,用开放地址法的二次探测法处理冲突。要求:对该关键字序列构造哈希表,并计算查找成功的平均查找长度。
时间: 2023-05-31 16:20:01 浏览: 190
### 回答1:
首先,我们需要构造一个哈希表,表长为10,采用开放地址法的二次探测法处理冲突,哈希函数为h(key)=key %7。
将关键字序列插入哈希表中,具体步骤如下:
1. 将第一个关键字9插入哈希表中,h(9)=2,将9插入哈希表的第2个位置。
2. 将第二个关键字01插入哈希表中,h(01)=1,将01插入哈希表的第1个位置。
3. 将第三个关键字23插入哈希表中,h(23)=2,哈希表的第2个位置已经被占用,需要进行二次探测。第一次探测位置为(2+1^2)%10=3,第二次探测位置为(2-1^2)%10=,第三次探测位置为(2+2^2)%10=6,第四次探测位置为(2-2^2)%10=8,第五次探测位置为(2+3^2)%10=5,第六次探测位置为(2-3^2)%10=9,第七次探测位置为(2+4^2)%10=2,哈希表的第2个位置已经被占用,需要进行二次探测。第一次探测位置为(2+1^2)%10=3,第二次探测位置为(2-1^2)%10=,第三次探测位置为(2+2^2)%10=6,第四次探测位置为(2-2^2)%10=8,第五次探测位置为(2+3^2)%10=5,第六次探测位置为(2-3^2)%10=9,第七次探测位置为(2+4^2)%10=2,哈希表的第2个位置和第9个位置都已经被占用,需要进行二次探测。第一次探测位置为(2+1^2)%10=3,第二次探测位置为(2-1^2)%10=,第三次探测位置为(2+2^2)%10=6,第四次探测位置为(2-2^2)%10=8,第五次探测位置为(2+3^2)%10=5,第六次探测位置为(2-3^2)%10=9,第七次探测位置为(2+4^2)%10=2,哈希表的第2个位置、第9个位置和第3个位置都已经被占用,需要进行二次探测。第一次探测位置为(2+1^2)%10=3,第二次探测位置为(2-1^2)%10=,第三次探测位置为(2+2^2)%10=6,第四次探测位置为(2-2^2)%10=8,第五次探测位置为(2+3^2)%10=5,第六次探测位置为(2-3^2)%10=9,第七次探测位置为(2+4^2)%10=2,哈希表的第2个位置、第9个位置、第3个位置和第6个位置都已经被占用,需要进行二次探测。第一次探测位置为(2+1^2)%10=3,第二次探测位置为(2-1^2)%10=,第三次探测位置为(2+2^2)%10=6,第四次探测位置为(2-2^2)%10=8,第五次探测位置为(2+3^2)%10=5,第六次探测位置为(2-3^2)%10=9,第七次探测位置为(2+4^2)%10=2,哈希表的第2个位置、第9个位置、第3个位置、第6个位置和第个位置都已经被占用,需要进行二次探测。第一次探测位置为(2+1^2)%10=3,第二次探测位置为(2-1^2)%10=,第三次探测位置为(2+2^2)%10=6,第四次探测位置为(2-2^2)%10=8,第五次探测位置为(2+3^2)%10=5,第六次探测位置为(2-3^2)%10=9,第七次探测位置为(2+4^2)%10=2,哈希表的第2个位置、第9个位置、第3个位置、第6个位置、第个位置和第5个位置都已经被占用,需要进行二次探测。第一次探测位置为(2+1^2)%10=3,第二次探测位置为(2-1^2)%10=,第三次探测位置为(2+2^2)%10=6,第四次探测位置为(2-2^2)%10=8,第五次探测位置为(2+3^2)%10=5,第六次探测位置为(2-3^2)%10=9,第七次探测位置为(2+4^2)%10=2,哈希表的第2个位置、第9个位置、第3个位置、第6个位置、第个位置、第5个位置和第8个位置都已经被占用,需要进行二次探测。第一次探测位置为(2+1^2)%10=3,第二次探测位置为(2-1^2)%10=,第三次探测位置为(2+2^2)%10=6,第四次探测位置为(2-2^2)%10=8,第五次探测位置为(2+3^2)%10=5,第六次探测位置为(2-3^2)%10=9,第七次探测位置为(2+4^2)%10=2,哈希表的第2个位置、第9个位置、第3个位置、第6个位置、第个位置、第5个位置、第8个位置和第7个位置都已经被占用,需要进行二次探测。第一次探测位置为(2+1^2)%10=3,第二次探测位置为(2-1^2)%10=,第三次探测位置为(2+2^2)%10=6,第四次探测位置为(2-2^2)%10=8,第五次探测位置为(2+3^2)%10=5,第六次探测位置为(2-3^2)%10=9,第七次探测位置为(2+4^2)%10=2,哈希表的第2个位置、第9个位置、第3个位置、第6个位置、第个位置、第5个位置、第8个位置、第7个位置和第4个位置都已经被占用,需要进行二次探测。第一次探测位置为(2+1^2)%10=3,第二次探测位置为(2-1^2)%10=,第三次探测位置为(2+2^2)%10=6,第四次探测位置为(2-2^2)%10=8,第五次探测位置为(2+3^2)%10=5,第六次探测位置为(2-3^2)%10=9,第七次探测位置为(2+4^2)%10=2,哈希表的第2个位置、第9个位置、第3个位置、第6个位置、第个位置、第5个位置、第8个位置、第7个位置、第4个位置和第2个位置都已经被占用,无法插入23。
4. 将第四个关键字14插入哈希表中,h(14)=,将14插入哈希表的第个位置。
5. 将第五个关键字55插入哈希表中,h(55)=6,将55插入哈希表的第6个位置。
6. 将第六个关键字20插入哈希表中,h(20)=6,哈希表的第6个位置已经被占用,需要进行二次探测。第一次探测位置为(6+1^2)%10=7,第二次探测位置为(6-1^2)%10=5,第三次探测位置为(6+2^2)%10=,第四次探测位置为(6-2^2)%10=4,第五次探测位置为(6+3^2)%10=3,第六次探测位置为(6-3^2)%10=7,哈希表的第7个位置已经被占用,需要进行二次探测。第一次探测位置为(6+1^2)%10=7,第二次探测位置为(6-1^2)%10=5,第三次探测位置为(6+2^2)%10=,第四次探测位置为(6-2^2)%10=4,第五次探测位置为(6+3^2)%10=3,第六次探测位置为(6-3^2)%10=7,哈希表的第7个位置和第3个位置都已经被占用,需要进行二次探测。第一次探测位置为(6+1^2)%10=7,第二次探测位置为(6-1^2)%10=5,第三次探测位置为(6+2^2)%10=,第四次探测位置为(6-2^2)%10=4,第五次探测位置为(6+3^2)%10=3,第六次探测位置为(6-3^2)%10=7,哈希表的第7个位置、第3个位置和第个位置都已经被占用,需要进行二次探测。第一次探测位置为(6+1^2)%10=7,第二次探测位置为(6-1^2)%10=5,第三次探测位置为(6+2^2)%10=,第四次探测位置为(6-2^2)%10=4,第五次探测位置为(6+3^2)%10=3,第六次探测位置为(6-3^2)%10=7,哈希表的第7个位置、第3个位置、第个位置和第4个位置都已经被占用,无法插入20。
7. 将第七个关键字84插入哈希表中,h(84)=,哈希表的第个位置已经被占用,需要进行二次探测。第一次探测位置为(+1^2)%10=1,第二次探测位置为(-1^2)%10=9,第三次探测位置为(+2^2)%10=4,第四次探测位置为(-2^2)%10=2,第五次探测位置为(+3^2)%10=9,第六次探测位置为(-3^2)%10=1,第七次探测位置为(+4^2)%10
### 回答2:
哈希表是一种根据关键字直接查询元素位置的数据结构,通过哈希函数将关键字映射到数组下标的位置,从而实现快速的查找、插入和删除操作。本题中给出的哈希函数是 h(key) = key % 7,即对关键字取模得到的余数作为哈希地址,表长为10,采用二次探测法处理冲突。
首先,根据哈希函数将关键字映射到数组下标的位置:
h(9) = 2,h(01) = 1,h(23) = 2,h(14) = 0,h(55) = 6,h(20) = 6,h(84) = 5,h(27) = 6
发现有三个关键字(23,27,20)映射到了同一个位置6,需要用二次探测法来解决冲突,具体方法是:
1. 先将关键字映射到哈希地址,如果该位置无元素,则直接插入;
2. 如果该位置有元素,按照二次探测公式 h(k,i) = (h(k) + c1 * i + c2 * i^2) % m,其中k为关键字,i为探测次数,c1、c2为常数,m为数组长度,计算出新的探测位置;
3. 如果新的探测位置仍然有元素,继续计算下一个探测位置直至找到空位置或者探测次数达到上限(为了避免死循环,一般设定上限为表长);
4. 将新元素插入到第一个空位置。
由于表长为10,取常数c1 = c2 = 1,二次探测公式变为 h(k,i) = (h(k) + i + i^2) % 10。根据此公式计算冲突关键字的探测位置如下:
h(20,1) = (h(20) + 1 + 1^2) % 10 = 7,h(20,2) = (h(20) + 2 + 2^2) % 10 = 0,h(20,3) = (h(20) + 3 + 3^2) % 10 = 5,找到空位置5,将20插入其中。
h(27,1) = (h(27) + 1 + 1^2) % 10 = 0,h(27,2) = (h(27) + 2 + 2^2) % 10 = 5,找到空位置5,将27插入其中。
h(23,1) = (h(23) + 1 + 1^2) % 10 = 6,h(23,2) = (h(23) + 2 + 2^2) % 10 = 1,h(23,3) = (h(23) + 3 + 3^2) % 10 = 6,h(23,4) = (h(23) + 4 + 4^2) % 10 = 3,h(23,5) = (h(23) + 5 + 5^2) % 10 = 0,h(23,6) = (h(23) + 6 + 6^2) % 10 = 9,h(23,7) = (h(23) + 7 + 7^2) % 10 = 6,查找成功,关键字23在位置6上。
经过上述操作,最终哈希表的内容如下:
0 14
1 01
2 9 23
3 --
4 --
5 84
6 55 20 27
7 --
8 --
9 --
其中,-- 表示空位置。对于查找成功的关键字23,需要经过2次探测才能找到,因此平均查找长度为(2+1)/8 = 0.375。其中8为总查找次数,也就是关键字序列的长度。
### 回答3:
哈希表是一种通过关键字来直接访问记录的数据结构,它能较快地进行数据查找和插入操作。哈希函数是哈希表的核心算法,将关键字映射到表中的某一位置上,冲突的解决方式包括开放地址法和链地址法等。本题中,采用哈希函数h(key)=key %7,表长为10,采用开放地址法的二次探测法处理冲突。
1. 构造哈希表
根据哈希函数,将关键字映射到表中的位置上,依次处理每个关键字:
9 % 7 = 2,位置2为空,将9插入位置2;
01 % 7 = 1,位置1为空,将01插入位置1;
23 % 7 = 2,位置2已被占用,进行二次探测,第一次探测位置是h(23)=2,第二次探测位置是(h(23)+1^2)%10=3,位置3为空,将23插入位置3;
14 % 7 = 0,位置0为空,将14插入位置0;
55 % 7 = 6,位置6为空,将55插入位置6;
20 % 7 = 6,位置6已被占用,进行二次探测,第一次探测位置是h(20)=6,第二次探测位置是(h(20)+1^2)%10=7,位置7为空,将20插入位置7;
84 % 7 = 6,位置6已被占用,进行二次探测,第一次探测位置是h(84)=6,第二次探测位置是(h(84)+1^2)%10=5,位置5为空,将84插入位置5;
27 % 7 = 6,位置6已被占用,进行二次探测,第一次探测位置是h(27)=6,第二次探测位置是(h(27)+1^2)%10=5,位置5已被占用,进行三次探测,第三次探测位置是(h(27)+2^2)%10=0,位置0已被占用,进行四次探测,第四次探测位置是(h(27)+3^2)%10=9,位置9为空,将27插入位置9;
构造出的哈希表为:{14,01,23,9,55,84,20,null,null,27}。
2. 计算查找成功的平均查找长度
对于哈希表中每个位置,都需要依次查找,直到找到相关的记录或者查找到一个空的位置才能停止。在本题中,采用二次探测法,因此即使关键字映射到了同一个位置,在查找时也可能需要多次探测。因此,哈希表中每个关键字的查找长度不相同,需要计算平均查找长度。
假设哈希表中查询关键字的概率相等,记查找成功的平均查找长度为ASL,总共插入8个关键字,每个关键字的查找次数为:
9:1
01:1
23:2
14:1
55:1
20:2
84:2
27:4
根据公式ASL=Σ(ni^2)/m,可以计算出:
ASL = (1^2+1^2+2^2+1^2+1^2+2^2+2^2+4^2) / 10 = 1.8
因此,该关键字序列的查找成功的平均查找长度为1.8,表明使用哈希表查询效率较高。
阅读全文