散列 - 在散列表中插入一个值

问题描述:

任何人都可以帮助我修复将值插入散列表的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

你可以把你的测试代码? – HuStmpHrrr

+1

是否给予[无,无,无,无,无]或[无,无,无,3,10,无,20]?下定决心。 –

+0

@stefan我认为这是一个测试案例,而不是当前输出的值。 –

这是不因为在开始时,插槽全部是None,所以while中的代码从不执行。此代码包含将值分配给插槽的代码。你可以通过这样做来解决这个问题:

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

你是在正确的轨道上。首先,你应该使用你创建的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 

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

你也应该使用大小的属性创建像这样:

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