2015-06-08 4 views
0

Мое задание состоит в том, чтобы реализовать карту с цепочкой, создав хеш-таблицу с двумя списками, один из которых называется «слоты» и один называется «данные. Мой код работает до тех пор, пока символ« G » .. Я не могу достаточно точно определить, что происходит здесь, и я попытался отладкиPython: реализация карты с цепочкой

class HashTable: 
    def __init__(self): 
     self.size = 11 
     self.slots = [None] * self.size 
     self.data = [None] * self.size 

    def put(self,key,data): 
     hashvalue = self.hashfunction(key,len(self.slots)) 

     if self.slots[hashvalue] == None: 
      self.slots[hashvalue] = list() 
      self.slots[hashvalue].append(key) 
      self.data[hashvalue] = list() 
      self.data[hashvalue].append(data) 
     else: 
      if self.slots[hashvalue] != None: 
       self.data[hashvalue].append(data) #replace 

    def hashfunction(self,key,size): 
     return key%size 


    def get(self,key): 
     startslot = self.hashfunction(key,len(self.slots)) 

     data = None 
     stop = False 
     found = False 
     position = startslot 
     while self.slots[position] != None and not found and not stop: 
      for index in range (len(self.slots[position])): 
       if self.slots[position][index]== key: 
        found = True 
        data = self.data[position][index] 
        break 
      position+1 
      if position == startslot: 
       stop = True 
     return data 

    def __getitem__(self,key): 
     return self.get(key) 

    def __setitem__(self,key,data): 
     self.put(key,data) 

## TEST FOR HashTable 
h = HashTable() # create new hash table 

nums = [1, 3, 5, 50, 1000] # some keys 
nums = nums + [ len(h.slots)*i for i in range(20)] # some keys that have same hash 
vals = [ chr(x) for x in range(ord('A'),ord('Z')) ] # list of single letters from A to Z 

# add key/values 
for i in range(len(nums)): 
    # print("adding (%d, %s)"%(nums[i],vals[i]),end=" ") 
    h[nums[i]] = vals[i] 

for i in range(len(nums)): 
    key = nums[i] 
    value = vals[i] 
    gotValue = h[key] 
    assert gotValue == value,"expected key: %d to lookup value: %s but got value %s instead " % (key, value, gotValue) 

print("\nAll TESTS PASSED") 
+0

где происходит ошибка? – user1767754

ответ

0

Я нашел свой вопрос:

Я забыл добавить строку в:

if self.slots[hashvalue] != None: 

, который добавляет ключ к [hashvalue] слотов. Так что теперь у меня есть:

if self.slots[hashvalue] != None: 
      self.slots[hashvalue].append(key) 
      self.data[hashvalue].append(data) 

Он добавлял значение данных в соответствующий список «данных», но не соответтсвующее ключевое значение в списке «слотов»

Смежные вопросы