Как реализовать динамическое хеширование в хеш-таблице на Python? - PullRequest
0 голосов
/ 19 мая 2018

Я новичок в Python, и в настоящее время у меня есть класс хеш-таблицы, который разрешает столкновения с помощью линейного зондирования.Однако, если коэффициент загрузки выше 2/3, я хочу удвоить размер массива.Тем не менее, я получаю сообщение об ошибке

if self.array[i]!=None:
IndexError: invalid index

Это потому, что каждый раз, когда я изменяю размер таблицы, размер не обновляется в моем getLoadandAverageProbeLength?

Функция моего заданного элемента:

 def __setitem__(self, key, value):
    position = self.hash_value(key)
    sameKeyCollision=False
    load,averageProbeLength= self.getLoadAndAverageProbeLength(self.totalProbeLength)
    loadFactor=load
    if loadFactor<(2/3):
        if self.array[position] is None:#found empty slot, collision resolve
            self.array[position] = (key, value)
            self.count += 1
            sameKeyCollision=False


            return
        elif self.array[position][0] == key:#found key
            self.array[position] = (key, value)#update value, no collision
            return
        elif self.array[position][0] !=key and sameKeyCollision==False:#not found try next,first time collision
            position = (position+1) % self.table_size
            self.totalProbeLength+=1
            self.collision+=1
            sameKeyCollision=True
        elif self.array[position][0] !=key and sameKeyCollision==True:#probing
            position = (position+1) % self.table_size
            self.totalProbeLength+=1

Мой getLoadAndAverageProbeLength

def getLoadAndAverageProbeLength(self,probeLength):
    count=0
    averageProbeLength=0
    for i in range(self.table_size):
        if self.array[i]!=None:
            count+=1

    load= count/self.table_size

    if count!=0:
        averageProbeLength=probeLength/count
    return load,averageProbeLength

Это мой конструктор классов для моей хеш-таблицы:

def __init__(self, size=2):
    self.count = 0
    self.table_size = size
    self.array = build_array(self.table_size)
    self.collision=0
    self.totalProbeLength=0

Это мой трассировщик:

   Traceback (most recent call last):
  File "C:\Users\User\Desktop\Assignment3Task3(b).py", line 18, in <module>
main()
 File "C:\Users\User\Desktop\Assignment3Task3(b).py", line 15, in main
readFile(filename)
 File "C:\Users\User\Desktop\Assignment3Task3(b).py", line 10, in readFile
hashTable[line]=line
 File "C:\Users\User\Desktop\Assignment3Task4.py", line 55, in __setitem__
self.__setitem__(key,value)
 File "C:\Users\User\Desktop\Assignment3Task4.py", line 29, in __setitem__
load,averageProbeLength= self.getLoadAndAverageProbeLength(self.totalProbeLength)
File "C:\Users\User\Desktop\Assignment3Task4.py", line 83, in getLoadAndAverageProbeLength
if self.array[i]!=None:

IndexError: неверный индекс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...