给定输入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函数 h(X)=X%10。如果用大小为10的散列表,并且用分离链接法解决冲突,则输入各项经散列后在表中的下标为:(-1表示相应的插入无法成功)
时间: 2024-05-27 16:10:18 浏览: 137
首先,我们需要创建一个大小为10的散列表,每个插入的元素都经过散列函数 h(X)=X%10 处理。
下一步是将输入序列中的每个元素插入散列表中。如果出现冲突,则使用分离链接法解决冲突,即在该位置上存储一个链表,以便在同一位置上存储多个值。
以下是每个输入元素经过散列函数处理后在表中的下标:
- 4371 -> 1
- 1323 -> 3
- 6173 -> 3 (发生冲突,插入链表)
- 4199 -> 9
- 4344 -> 4
- 9679 -> 9 (发生冲突,插入链表)
- 1989 -> 9 (发生冲突,插入链表)
因此,最终散列表如下:
0:
1: 4371
2:
3: 1323 -> 6173
4: 4344
5:
6:
7:
8:
9: 4199 -> 9679 -> 1989
相关问题
给定输入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函数 h(x)=x%10。如果用大小为10的散列表,并且用线性探测解决冲突,则输入各项经散列后在表中的下标为:(-1表示相应的插入无法成功)
### 回答1:
题目要求通过散列表的哈希函数h(x)=x%10将输入的序列{4371, 1323, 6173, 4199, 4344, 9679, 1989}映射为散列表中的位置,并且用线性探测解决冲突。如果使用大小为10的散列表,并且无法成功插入对应的位置,则在表中的下标为:(-1表示相应的插入无法成功)
### 回答2:
散列函数是将给定的输入映射到散列表中的特定位置。在这个例子中,散列函数 h(x)=x % 10 将每一个输入值的个位数作为散列表中的位置。如果两个输入值映射到同一个位置,则会发生冲突。为了解决冲突,我们可以使用线性探测方法,即在冲突的位置上依次查找下一个可用的位置。因此,如果在某个位置上发生冲突,我们会检查下一个位置,如果它也被占用则继续向下查找,直到找到一个空闲的位置。
下面是这个输入序列在用大小为10的散列表,并且用线性探测解决冲突的情况下所映射到的散列表中的位置:
4371 -> 1
1323 -> 3
6173 -> 3(发生冲突,线性探测到下一个位置)
4199 -> 9
4344 -> 4
9679 -> 9(发生冲突,线性探测到下一个位置,然后又发生了冲突,继续线性探测)
1989 -> 9(发生冲突,线性探测到下一个位置,然后又发生了冲突,继续线性探测,然后又发生了冲突,继续线性探测)
最终,这个输入序列的映射情况如下:
0:-1
1:4371
2:-1
3:1323
4:4344
5:-1
6:6173
7:-1
8:-1
9:4199, 9679, 1989(发生冲突,线性探测到同一个位置)
### 回答3:
散列表是一种常用的数据结构,它可以将数据快速地进行存储和查找。散列表使用散列函数将数据存储在数组中。给定输入序列{4371, 1323, 6173, 4199, 4344, 9679, 1989}和散列函数h(x) = x % 10,我们需要使用散列表来存储这些数据,并且需要使用线性探测解决冲突。
散列表的大小是10,因此我们需要创建一个大小为10的数组。首先,我们需要将散列表的所有元素初始化为-1。这可以表示该位置上目前没有数据。接下来,我们对输入序列中的每个元素进行散列,然后将其插入到散列表中。
4371 % 10 = 1, 将 4371 存储在散列表的第1个位置上。
1323 % 10 = 3, 将 1323 存储在散列表的第3个位置上。
6173 % 10 = 3, 由于第3个位置已经被占用了,因此使用线性探测方法,将 6173 存储在散列表的第4个位置上。
4199 % 10 = 9, 将 4199 存储在散列表的第9个位置上。
4344 % 10 = 4, 将 4344 存储在散列表的第4个位置的下一个位置上。
9679 % 10 = 9, 由于第9个位置已经被占用了,因此使用线性探测方法,将 9679 存储在散列表的第0个位置上。
1989 % 10 = 9, 由于第9个位置和第0个位置都已经被占用了,因此使用线性探测方法,继续向下查找,将 1989 存储在散列表的第1个位置的下一个位置上。
因此,最终输入各项经散列后在表中的下标为:
0 1 3 4 5 -1 -1 -1 -1 9
可以看到,其中两个元素在同一个位置进行了线性探测,并且找到了一个空闲的位置来存储数据。其他的元素都被成功地存储在了散列表的不同位置上。这个散列表使用的是最基本的线性探测方法,当然,还有其他的探测方法,比如二次探测和双重散列等,可以更好地解决冲突问题。
给定输入{4317, 1323, 6173, 4199, 4344, 9679, 1989},散列表的长度为11,散列函数为H(x)=X mod 11,写出下列结果。 (1) 线性探测散列表。 (2) 二次探测散列表。 (3) 开散列表。
(1) 线性探测散列表:
散列函数:H(x)=X mod 11
插入顺序:4317, 1323, 6173, 4199, 4344, 9679, 1989
散列表:[4317, 9679, 1323, 6173, 4199, 4344, 0, 0, 0, 0, 1989]
解释:第一个数 4317 对应的散列地址为 4317 mod 11 = 8,散列表中该位置为空,因此直接插入该位置。同理,1323 对应的散列地址为 1323 mod 11 = 0,6173 对应的散列地址为 6173 mod 11 = 4,4199 对应的散列地址为 4199 mod 11 = 4,由于 4 号位置已经被占用,因此需要进行线性探测,即向后遍历散列表,直到找到一个空位置插入。最终散列表如上所示。
(2) 二次探测散列表:
散列函数:H(x)=X mod 11
插入顺序:4317, 1323, 6173, 4199, 4344, 9679, 1989
散列表:[4317, 9679, 1323, 6173, 4199, 4344, 0, 0, 0, 0, 1989]
解释:与线性探测散列表类似,不同之处在于二次探测需要按照一定公式计算跳跃的步长,具体实现可参考二次探测散列表的算法实现。
(3) 开散列表:
散列函数:H(x)=X mod 11
插入顺序:4317, 1323, 6173, 4199, 4344, 9679, 1989
散列表:[6173 -> 9679 -> 1989, 4317, 1323, 0, 0, 0, 0, 0, 0, 4199 -> 4344, 0]
解释:开散列表采用链表解决冲突,并且需要保证链表中的元素顺序与插入顺序相同。首先将 6173、9679、1989 三个数插入到散列地址为 6 的位置,由于 4199 对应的散列地址为 4199 mod 11 = 5,与 4344 对应的散列地址相同,因此将其插入到地址为 5 的位置,并且与 4344 组成链表。最终散列表如上所示。
阅读全文