📜  在C++中使用开放式寻址线性探测实现自己的哈希表(1)

📅  最后修改于: 2023-12-03 15:07:52.442000             🧑  作者: Mango

在C++中使用开放式寻址线性探测实现自己的哈希表

哈希表是一种数据结构,用于存储键值对,并能够快速查找、插入和删除数据。哈希表通过将键映射到桶中来实现这一目的。在桶中,通过哈希函数将键映射到一个索引,这个索引一般是一个整数。具体来说,哈希表通过使用哈希函数将键映射到一个整数索引,然后将该键值对存储在该索引处。

开放式寻址是一种哈希表实现方法,其中哈希冲突时,相同哈希值的键值对通过不断探测桶中下一个空闲槽位的方式找到一个新的位置进行存储。线性探测是一种开放式寻址的方法,其中新位置在桶中通过线性探测来查找,直到找到一个空闲的槽位。

下面是一个简单的使用开放式寻址线性探测实现自己的哈希表的例子:

#include <iostream>

#define EMPTY -1
#define DELETED -2

class HashTable {
  int *table;
  int size;
  int max_size;
  int hash(int key) { return key % max_size; }

public:
  HashTable(int max_size) : max_size(max_size) {
    this->size = 0;
    this->table = new int[max_size];
    for (int i = 0; i < max_size; i++) {
      this->table[i] = EMPTY;
    }
  }

  ~HashTable() { delete[] this->table; }

  void insert(int key) {
    if (this->size >= this->max_size) {
      return;
    }

    int index = hash(key);
    while (this->table[index] != EMPTY && this->table[index] != DELETED &&
           this->table[index] != key) {
      index = (index + 1) % this->max_size;
    }

    if (this->table[index] != key) {
      this->table[index] = key;
      this->size++;
    }
  }

  bool search(int key) {
    int index = hash(key);
    int i = 0;
    while (this->table[index] != EMPTY && i < this->max_size) {
      if (this->table[index] == key) {
        return true;
      }
      index = (index + 1) % this->max_size;
      i++;
    }
    return false;
  }

  void remove(int key) {
    int index = hash(key);
    int i = 0;
    while (this->table[index] != EMPTY && i < this->max_size) {
      if (this->table[index] == key) {
        this->table[index] = DELETED;
        this->size--;
        return;
      }
      index = (index + 1) % this->max_size;
      i++;
    }
  }
};

在这个例子中,我们创建了一个HashTable类,它使用table数组存储键值对。在构造函数中,我们初始化table数组为EMPTYinsert方法使用哈希函数计算出键的索引,然后使用线性探测来查找是否已经存在相同的键。如果存在,就不插入;如果不存在,就将键值对存储在table中。searchremove方法都是通过哈希函数和线性探测来搜索存储在table中的键值对。

这只是一个非常简单的例子,实际上,哈希表的实现还可以更加高效、灵活,并且可以支持多种哈希函数和解决哈希冲突的方法。但是,使用开放式寻址线性探测的方法是一种简单而且通用的方法,可以满足大多数应用的需求。

希望这个例子对您有所帮助!