设散列表a[18],散列函数是hask(k)=k%17,用开放地址法解决冲突hi=(h0+di)%m。冲突时采用平方探测法,使用增量序列di=i* i。计算输入序列(值>=0)对应的散列地址并进行查找,如果有此元素,则输出散列地址,如果无此元素,则输出not found。并输出查找次数(输入个数不会超过15个) 输入格式: 第一行为输入个数; 第二行为对应的输入值,用空格隔开; 第三行为需查找的元素,第1个为查找元素个数,后面为查找元素 输出格式: 第一行依次输出输入序列的散列地址,以一个空格隔开; 第二行开始输出查找元素的散列地址,每个元素占一行,每行对应一个值及其散列地址,中间用空格隔开(即pos前后均有一个空格),如果无此元素,则输出not found。 输入样例: 5 141 73 95 112 56 7 5 73 95 141 112 56 18 输出样例: 5 6 10 11 9 5 not found,try 4 73 pos:6,try 2 95 pos:10,try 1 141 pos:5,try 1 112 pos:11,try 2 56 pos:9,try 3 18 not found,try 1
时间: 2024-03-25 18:40:21 浏览: 278
这是一道比较复杂的题目,需要进行多次散列和探测。下面是 Python 代码实现,供您参考。
```python
def hash_func(key):
return key % 17
def probe_hash(pos, i):
return (pos + i * i) % 18
def insert_hash(hash_table, key):
pos = hash_func(key)
i = 0
while hash_table[pos] != -1:
i += 1
pos = probe_hash(pos, i)
hash_table[pos] = key
def search_hash(hash_table, key):
pos = hash_func(key)
i = 0
while hash_table[pos] != -1 and hash_table[pos] != key:
i += 1
pos = probe_hash(pos, i)
if hash_table[pos] == key:
return pos, i
else:
return -1, i
n = int(input())
lst = list(map(int, input().split()))
m = lst.pop(0)
hash_table = [-1] * 18
for key in lst:
insert_hash(hash_table, key)
for key in lst:
pos, i = search_hash(hash_table, key)
if pos == -1:
print("not found,try", i)
else:
print(pos, end=" ")
print()
m = int(input().split()[0])
for i in range(m):
key = int(input())
pos, i = search_hash(hash_table, key)
if pos == -1:
print("not found,try", i)
else:
print(key, "pos:", pos, "try", i)
```
需要注意的几个点:
- 散列表长度为 18,而不是 17,因为探测使用的增量序列是平方序列。
- 对于每个输入的值,需要进行插入操作,而不是仅仅计算散列地址。
- 对于每个需要查找的元素,需要进行查找操作,如果找到了,输出散列地址和探测次数;如果没有找到,输出 not found 和探测次数。
阅读全文