哈希的例子 - 超级代码

时间:2011-10-14 17:25:09

标签: c++

我发现这个代码段here是最简单的哈希值的示例。它有点自那以后......基本上使用模运算符将数据集从DATA_SIZE(隐含)减少到TABLE_SIZE(已定义)。

但是,如果发生碰撞,即已经采用了数组元素,则移动到

hash = (hash + 1) % TABLE_SIZE

但是如果你已经使用TABLE SIZE做了一个模数,那么这一行总是产生(hash + 1)b.c.当x

const int TABLE_SIZE = 128;

class HashEntry 
  {
  private:
    int key;
    int value;
  public:
    HashEntry(int key, int value) 
      {
      this->key = key;
      this->value = value;
      }
    int getKey() 
      {
      return key;
      }
    int getValue() 
      {
      return value;
      }
  }; 

class HashMap 
  {
  private:
    HashEntry **table;
  public:
    HashMap() 
      {
      table = new HashEntry*[TABLE_SIZE];
      for (int i = 0; i < TABLE_SIZE; i++) table[i] = NULL;
      }
    int get(int key) 
      {
      int hash = (key % TABLE_SIZE);
      while (table[hash] != NULL && table[hash]->getKey() != key) hash = (hash + 1) % TABLE_SIZE;
      if (table[hash] == NULL)return -1;
      else return table[hash]->getValue();
      }
    void put(int key, int value) 
      {
      int hash = (key % TABLE_SIZE);
      while (table[hash] != NULL && table[hash]->getKey() != key) hash = (hash + 1) % TABLE_SIZE;
      if (table[hash] != NULL) delete table[hash];
      table[hash] = new HashEntry(key, value);
      }     
    ~HashMap() 
      {
      for (int i = 0; i < TABLE_SIZE; i++)
         if (table[i] != NULL) delete table[i];
      delete[] table;
      }
  };

1 个答案:

答案 0 :(得分:3)

如果出现溢出,该模数就存在。

假设hash == TABLE_SIZE - 1。然后是hash + 1 == TABLE_SIZE,而hash+1 % TABLE_SIZE == 0