Счетчики для квадратичного зондирования

Я пытаюсь подсчитать количество зондов (или количество индексов, которые должны быть переданы) при вставке ключей в список с помощью квадратичного зондирования

я имею

def hash_quadratic(key, values):
    tablesize=len(values)
    index=key%tablesize
    probes=0
    if values[index] is None:
        values[index]=key
        probes+=1
        return probes
    else:
        while values[index] is not None:
            index = (index+1**2)% tablesize
            probes+=1
        values[index]=key
    return probes

Я думаю, что это учитывается каждый раз, когда индекс изменяется, но не учитывает количество индексов, которые он пересекает. Как мне подсчитать каждый индекс, который проходит ключ?

1 ответ

Если вы хотите реализовать Quadratic probe для хеш-таблицы, вам нужно больше, чем написанная вами функция. Следующий класс выполняет работу, которую вы ищете:

class HashTable(object):
    def __init__(self,  size=200):
        self.size = size
        self.slots = [None] * self.size

    def hash_function(self, key):
        s = str(key)    
        n_hash = 0
        for obj in s:
            if obj.isdigit():
               n_hash = (n_hash << 5) + n_hash + ord(obj)
        return n_hash % self.size    

    def quad_prob(self, oldhash, iter):
        n_hash = 0
        n_hash = (oldhash + iter**2) % self.size
        return n_hash    

    def put(self, key):
        collis_count = 0
        hashval = self.hash_function(key)            
        if self.slots[hashval] == None:
           self.slots[hashval] = key
        else:
           if self.slots[hashval] == key:
              pass
           else:
              iter_count = 1
              first_hash = hashval
              nextslot = self.quad_prob(first_hash, iter_count)
              # looking for a key or any empty slot
              while self.slots[nextslot] != None and self.slots[nextslot] != key and iter_count <= self.size:
                    iter_count += 1
                    nextslot = self.quad_prob(first_hash, iter_count)
              collis_count = iter_count
              if self.slots[nextslot] == None:
                 self.slots[nextslot] = key
        return collis_count
Другие вопросы по тегам