散列 - 将值插入散列表

时间:2017-05-27 00:35:44

标签: python hash

任何人都可以帮我修复我的put函数,它将值插入哈希表吗? 现在我得到一个完整的哈希表的输出 例如[无,无,无,无,无]

class BasicHashTable:
def __init__(self,size=7):
    self.size = size
    self.slots = [None] * self.size

def hash_function(self, key):
    return key%len(self.slots)

def rehash(self, old_pos):
    return (old_pos + 1) % self.size

def put(self, key):
    hash_value = key%len(self.slots)    
    probe_seq=[]     
    insert_pos=hash_value     
    probe_seq+=[insert_pos]     
    probes=1     
    while(self.slots[insert_pos]!=None):         
        probes+=1         
        insert_pos=(insert_pos+1)%len(self.slots)         
        probe_seq+=[insert_pos]     
        self.slots[insert_pos]=key     
    return insert_pos

测试:

hash_t = BasicHashTable() 
hash_t.put(3)
hash_t.put(20)
hash_t.put(10)
print(hash_t.slots)

给[无,无,无,3,10,无,20]

2 个答案:

答案 0 :(得分:3)

它没有添加到地图中,因为在开始时,插槽都是None,因此while中的代码永远不会执行。此代码包含将值分配给插槽的代码。您可以通过执行以下操作来解决此问题:

# code
while(self.slots[insert_pos]!=None):         
    #code  
self.slots[insert_pos]=key  # unindented
# code

答案 1 :(得分:0)

你走在正确的轨道上。首先,您应该使用您创建的rehash方法。因此,如果无法立即插入密钥,您将生成新的哈希。您将继续执行此操作,直到找到空插槽,然后您将密钥插入该插槽。

def put(self, key):
    insert_pos = self.hash_function(key)
    if self.slots[insert_pos] == None:
        self.slots[insert_pos] = key
    else:
        insert_pos = self.rehash(insert_pos)
        while self.slots[insert_pos] != None and self.slots[insert_pos] != key:
            insert_pos = self.rehash(insert_pos)
        if self.slots[insert_pos] == None:
            self.slots[insert_pos] = key

一旦所有的插槽都被填满,如果你试图添加一个新的密钥,程序将无限循环;我会让你找到解决这个问题的方法。当您开始向密钥添加数据时,您可能会找到解决方案。

此外,您应该使用您创建的size属性:

def hash_function(self, key):
    return key%self.size