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

哈希表是一种数据结构,用于存储键值对。哈希表使用哈希函数来计算要插入或搜索元素的数组的索引。

线性探测是开放地址哈希表中的冲突解决技术。在这种方法中,哈希表的每个单元格都存储一个键-值对。如果通过将新键映射到哈希表中已经被另一个键占用的单元格而发生冲突。此方法在表中搜索以下最接近的空闲位置,然后在其中插入新键。

这是一个使用线性探测实现哈希表的C ++程序。

算法

Begin

   Declare function Insert(int k, int v)

      Declare hash_val, init, delindex to the integer pointer.

         initialize hash_val = HashFunc(k)

         intialize init = -1

         intialize delindex = -1

      while (hash_val != init and (ht[hash_val]

         == DelNode::getNode() or ht[hash_val]

         != NULL and ht[hash_val]->k != k))

            if (init == -1)

               init = hash_val

            if (ht[hash_val] == DelNode::getNode())

               delindex = hash_val

            hash_val = HashFunc(hash_val + 1)

      if (ht[hash_val] == NULL or hash_val == init)

         if(delindex != -1)

            ht[delindex] = new HashTable(k, v)

         else

            ht[hash_val] = new HashTable(k, v)

      if(init != hash_val)

         if (ht[hash_val] != DelNode::getNode())

            if (ht[hash_val] != NULL)

               if (ht[hash_val]->k== k)

                  ht[hash_val]->v = v

         else

            ht[hash_val] = new HashTable(k, v)

End.

对于搜索键值:

Begin

   Declare Function SearchKey(int k)

      Declare hash_val, init of the integer datatype.

         initialize hash_val = HashFunc(k)

         intialize init = -1

      while (hash_val != init and (ht[hash_val]

         == DelNode::getNode() or ht[hash_val]

         != NULL and ht[hash_val]->k!= k

            if (init == -1)

               init = hash_val

            hash_val = HashFunc(hash_val + 1)

         if (ht[hash_val] == NULL or hash_val == init)

            return -1

         else

            return ht[hash_val]->v

End.

对于删除:

Begin

   Declare Function Remove(int k)

      Declare hash_val, init of the integer datatype.

         initialize hash_val = HashFunc(k)

         initialize init = -1

      while (hash_val != init and (ht[hash_val]

         == DelNode::getNode() or ht[hash_val]

         != NULL and ht[hash_val]->k!= k))

            if (init == -1)

               init = hash_val

            hash_val = HashFunc(hash_val + 1)

         if (hash_val != init and ht[hash_val] != NULL)

            delete ht[hash_val]

            ht[hash_val] = DelNode::getNode()

End.

范例程式码

#include <iostream>

#include <cstdio>

#include <cstdlib>

using namespace std;

const int T_S = 5;

class HashTable {

   public:

      int k;

      int v;

      HashTable(int k, int v) {

         this->k = k;

         this->v = v;

      }

};

class DelNode:public HashTable {

   private:

      static DelNode *en;

      DelNode():HashTable(-1, -1) {}

   public:

      static DelNode *getNode() {

         if (en == NULL)

            en = new DelNode();

         return en;

      }

};

DelNode *DelNode::en = NULL;

class HashMapTable {

   private:

      HashTable **ht;

   public:

      HashMapTable() {

         ht = new HashTable* [T_S];

         for (int i = 0; i < T_S; i++) {

            ht[i] = NULL;

         }

      }

      int HashFunc(int k) {

         return k % T_S;

      }

      void Insert(int k, int v) {

         int hash_val = HashFunc(k);

         int init = -1;

         int delindex = -1;

         while (hash_val != init && (ht[hash_val] == DelNode::getNode() || ht[hash_val] != NULL && ht[hash_val]->k != k)) {

            if (init == -1)

               init = hash_val;

            if (ht[hash_val] == DelNode::getNode())

               delindex = hash_val;

               hash_val = HashFunc(hash_val + 1);

         }

         if (ht[hash_val] == NULL || hash_val == init) {

            if(delindex != -1)

               ht[delindex] = new HashTable(k, v);

            else

               ht[hash_val] = new HashTable(k, v);

         }

         if(init != hash_val) {

            if (ht[hash_val] != DelNode::getNode()) {

               if (ht[hash_val] != NULL) {

                  if (ht[hash_val]->k== k)

                     ht[hash_val]->v = v;

               }

            } else

               ht[hash_val] = new HashTable(k, v);

         }

      }

      int SearchKey(int k) {

         int hash_val = HashFunc(k);

         int init = -1;

         while (hash_val != init && (ht[hash_val] == DelNode::getNode() || ht[hash_val] != NULL && ht[hash_val]->k!= k)) {

            if (init == -1)

               init = hash_val;

               hash_val = HashFunc(hash_val + 1);

         }

         if (ht[hash_val] == NULL || hash_val == init)

            return -1;

         else

            return ht[hash_val]->v;

      }

      void Remove(int k) {

         int hash_val = HashFunc(k);

         int init = -1;

         while (hash_val != init && (ht[hash_val] == DelNode::getNode() || ht[hash_val] != NULL && ht[hash_val]->k!= k)) {

            if (init == -1)

               init = hash_val;

               hash_val = HashFunc(hash_val + 1);

         }

         if (hash_val != init && ht[hash_val] != NULL) {

            delete ht[hash_val];

            ht[hash_val] = DelNode::getNode();

         }

      }

      ~HashMapTable() {

         delete[] ht;

      }

};

int main() {

   HashMapTable hash;

   int k, v;

   int c;

   while(1) {

      cout<<"1.Insert element into the table"<<endl;

      cout<<"2.Search element from the key"<<endl;

      cout<<"3.Delete element at a key"<<endl;

      cout<<"4.Exit"<<endl;

      cout<<"Enter your choice: ";

      cin>>c;

      switch(c) {

         case 1:

            cout<<"Enter element to be inserted: ";

            cin>>v;

            cout<<"Enter key at which element to be inserted: ";

            cin>>k;

            hash.Insert(k, v);

         break;

         case 2:

            cout<<"Enter key of the element to be searched: ";

            cin>>k;

            if(hash.SearchKey(k) == -1) {

               cout<<"No element found at key "<<k<<endl;

               continue;

            } else {

               cout<<"Element at key "<<k<<" : ";

               cout<<hash.SearchKey(k)<<endl;

            }

         break;

         case 3:

            cout<<"Enter key of the element to be deleted: ";

            cin>>k;

            hash.Remove(k);

         break;

         case 4:

            exit(1);

         default:

            cout<<"\nEnter correct option\n";

      }

   }

   return 0;

}

输出结果

1.Insert element into the table

2.Search element from the key

3.Delete element at a key

4.Exit

Enter your choice: 1

Enter element to be inserted: 10

Enter key at which element to be inserted: 2

1.Insert element into the table

2.Search element from the key

3.Delete element at a key

4.Exit

Enter your choice: 1

Enter element to be inserted: 7

Enter key at which element to be inserted: 6

1.Insert element into the table

2.Search element from the key

3.Delete element at a key

4.Exit

Enter your choice: 1

Enter element to be inserted: 4

Enter key at which element to be inserted: 5

1.Insert element into the table

2.Search element from the key

3.Delete element at a key

4.Exit

Enter your choice: 1

Enter element to be inserted: 12

Enter key at which element to be inserted: 3

1.Insert element into the table

2.Search element from the key

3.Delete element at a key

4.Exit

Enter your choice: 15

Enter correct option

1.Insert element into the table

2.Search element from the key

3.Delete element at a key

4.Exit

Enter your choice: 1

Enter element to be inserted: 15

Enter key at which element to be inserted: 8

1.Insert element into the table

2.Search element from the key

3.Delete element at a key

4.Exit

Enter your choice: 2

Enter key of the element to be searched: 6

Element at key 6 : 7

1.Insert element into the table

2.Search element from the key

3.Delete element at a key

4.Exit

Enter your choice: 3

Enter key of the element to be deleted: 2

1.Insert element into the table

2.Search element from the key

3.Delete element at a key

4.Exit

Enter your choice: 2

Enter key of the element to be searched: 2

No element found at key 2

1.Insert element into the table

2.Search element from the key

3.Delete element at a key

4.Exit

Enter your choice: 4

以上是 在C ++中使用开放式寻址线性探测实现自己的哈希表 的全部内容, 来源链接: utcz.com/z/316813.html

回到顶部