我有一个用户定义的函数,它将table-size(m)作为输入。我实现了一个空列表(对[key,count],本质上是一个有两个字段的数组),并使用线性散列将生成的随机数插入列表中。因此,假设第一个随机数(k)是20并且列表(m)的长度是9,则散列函数(h0 = k%m)将返回2(因为这是20除以9时的余数)。如果该单元格为空,我想将键值(k)插入第一个字段,将1(探测计数)插入第二个字段。如果该单元格不为空,我想使用散列函数(h0 =(h0 + i)%m)递增索引,直到找到一个空单元格并插入那里。我想返回结果列表。我在我的函数中有一个return语句,我读过的文档说我在调用函数时使用print语句分配一个新值应该有效。我正在使用PyCharm社区版。我的IDE可能是问题吗? (下面是我的代码)
import random
def linear(m):
hTable = [[None, None] for j in range (m)]
for n in range (1100):
k = random.randint(1,10000)
for i in range(len(hTable)):
for j in range(len(hTable[i])):
h0 = k % m
if hTable[h0] == [None,None]:
hTable[h0][0] = k
hTable[h0][1] = 1
else:
while hTable[h0] != [None, None]:
hTable[h0][1] += 1
h0 = (h0 + i)%m
else:
hTable[h0][0] = k
hTable[h0][1] = 1
return hTable
hash = linear(1223)
print(hash)
答案 0 :(得分:0)
>>> [None,None]*2
[None, None, None, None]
在Python中,乘以列表会扩展列表,但不会使其成为多维的。你可能想要[[None, None] for i in range(m)
。
(我也不确定你的代码通常在做什么,因为在第一次迭代时,所有内容都会== [None, None]
并导致你的else
块被执行 - 其中有一个返回值,因此返回的数组将由hTable[h0] = [k, 1]
和每个其他元素[None, None]
...)
此外,h0
每次迭代都会有相同的值(因为它是根据未更改的值计算得出的)......您可能希望return hTable
,而不是[hTable]
,因为它已经是一个清单。
答案 1 :(得分:0)
问题是我的退货声明的缩进。以下作品:
import random
def linear(m):
hTable = [[None, 0] for j in range (m)]
nums = [random.randint(1,10001) for n in range(1100)]
for i in range(len(nums)):
h0 = nums[i] % m
while hTable[h0] != [None, 0]:
hTable[h0][1] += 1
h0 = (h0 + 1)%m
else:
hTable[h0][0] = nums[i]
hTable[h0][1] = 1
count = sum(i[1] for i in hTable)
print (count)
return hTable
l = linear(1223)
print(l)