📜  用于链式散列的 C++ 程序

📅  最后修改于: 2021-10-28 01:30:34             🧑  作者: Mango

在散列中,有一个将键映射到某些值的散列函数。但是这些散列函数可能会导致冲突,即两个或多个键被映射到相同的值。链散列避免冲突。这个想法是让哈希表的每个单元格都指向一个具有相同哈希函数值的记录链表。
让我们创建一个哈希函数,这样我们的哈希表就有“N”个桶。
要将节点插入哈希表,我们需要找到给定键的哈希索引。它可以使用哈希函数计算。
示例:hashIndex = key % noOfBuckets
Insert :移动到上面计算出的hash索引对应的bucket,在链表末尾插入新节点。
删除:从hash表中删除一个节点,计算key的hash索引,移动到计算出的hash索引对应的bucket,搜索当前bucket中的list,找到并删除给定key的节点(如果找到) .

请参考Hashing |设置 2(单独链接) 详情。
我们使用 C++ 中的列表,它在内部实现为链表(更快的插入和删除)。

CPP
// CPP program to implement hashing with chaining
#include
using namespace std;
 
class Hash
{
    int BUCKET;    // No. of buckets
 
    // Pointer to an array containing buckets
    list *table;
public:
    Hash(int V);  // Constructor
 
    // inserts a key into hash table
    void insertItem(int x);
 
    // deletes a key from hash table
    void deleteItem(int key);
 
    // hash function to map values to key
    int hashFunction(int x) {
        return (x % BUCKET);
    }
 
    void displayHash();
};
 
Hash::Hash(int b)
{
    this->BUCKET = b;
    table = new list[BUCKET];
}
 
void Hash::insertItem(int key)
{
    int index = hashFunction(key);
    table[index].push_back(key);
}
 
void Hash::deleteItem(int key)
{
  // get the hash index of key
  int index = hashFunction(key);
 
  // find the key in (index)th list
  list  :: iterator i;
  for (i = table[index].begin();
           i != table[index].end(); i++) {
    if (*i == key)
      break;
  }
 
  // if key is found in hash table, remove it
  if (i != table[index].end())
    table[index].erase(i);
}
 
// function to display hash table
void Hash::displayHash() {
  for (int i = 0; i < BUCKET; i++) {
    cout << i;
    for (auto x : table[i])
      cout << " --> " << x;
    cout << endl;
  }
}
 
// Driver program
int main()
{
  // array that contains keys to be mapped
  int a[] = {15, 11, 27, 8, 12};
  int n = sizeof(a)/sizeof(a[0]);
 
  // insert the keys into the hash table
  Hash h(7);   // 7 is count of buckets in
               // hash table
  for (int i = 0; i < n; i++)
    h.insertItem(a[i]); 
 
  // delete 12 from hash table
  h.deleteItem(12);
 
  // display the Hash table
  h.displayHash();
 
  return 0;
}


输出:
0
1 --> 15 --> 8
2
3
4 --> 11
5
6 --> 27

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程