散列(C++实现)

散列的构成:散列函数,散列表的存储方式,散列表的冲突解决方法。

1.散列函数

较常用的散列函数有除留余数法,数字分析法,平方取中法,折叠法。

2.散列表的存储方式

闭散列法(开地址法),用数组存储;开散列法(链地址法),用邻接链表存储。

3.散列表的冲突解决方法

主要是针对闭散列中关键码位置冲突的问题,常用的方法有线性探查法,二次探查法,双散列法。

性能分析:在存储方式中,开散列法优于闭散列法;在散列函数中,除留余数法最优。

实现代码:

1 #include<iostream>
  2 using namespace std;
  3 enum kind{Active,Empty,Deleted};
  4 class ArrayHashTable{//闭散列法 
  5     public:
  6         ArrayHashTable(const int d,int sz=20){
  7             tableSize=sz;
  8             divitor=d;
  9             table=new int[tableSize];
 10             info=new kind[tableSize];
 11             for(int i=0;i<tableSize;i++){
 12                 table[i]=0;
 13                 info[i]=Empty;
 14             }
 15         }
 16         ~ArrayHashTable(){
 17             delete[] table;
 18             delete[] info;
 19         }
 20         bool findPos(int k,int &i){//寻找k关键码所在位置i 
 21             i=k%divitor;
 22             int j=i;
 23             do{
 24                 if(info[i]==Active&&table[i]==k)
 25                     return true;
 26                 if(info[i]==Empty) 
 27                     return false;
 28                 i=(i+1)%tableSize;        
 29             }
 30             while(j!=i);
 31             return false;
 32         }
 33         bool insert(int k){//插入关键码k 
 34             int i;
 35             if(findPos(k,i))
 36                 return false;
 37             if(info[i]!=Active){
 38                 table[i]=k;
 39                 info[i]=Active;
 40                 return true;    
 41             }else
 42                 return false;
 43         }
 44         bool remove(int k){//删除关键码k 
 45             int i;
 46             if(!findPos(k,i))
 47                 return false;
 48             table[i]=Deleted;
 49             return true;
 50         }
 51         int *getArray(){
 52             return table;
 53         }
 54     private:
 55         int divitor;
 56         int tableSize;
 57         int *table;
 58         kind *info;
 59 };
 60 
 61 
 62 class Node{
 63     public:
 64         int data;
 65         Node *next;
 66         Node(int d,Node *n=NULL){
 67             data=d;
 68             next=n;
 69         }
 70 };
 71 class LinkedHashTable{//开散列法
 72     public:
 73         LinkedHashTable(int d,int sz=20){
 74             tableSize=sz;
 75             divitor=d;
 76             hs=new Node*[sz];
 77             for(int i=0;i<sz;i++)
 78             hs[i]=new Node(0);
 79         }
 80         ~LinkedHashTable(){
 81             delete []hs;
 82         }
 83         bool findPos(int k,Node *&p,Node *&last){
 84             int i=k%divitor;
 85             last=hs[i];
 86             p=hs[i]->next;
 87             while(p!=NULL&&p->data!=k){
 88                 p=p->next;
 89                 last=last->next;
 90             } 
 91             if(p!=NULL&&p->data==k)
 92                 return true;
 93              else
 94                  return false;
 95         }
 96         bool insert(int k){
 97             Node *p,*last;
 98             int i=k%divitor;
 99             if(findPos(k,p,last))
100                 return false;
101             last->next=new Node(k);    
102             return true;
103         }
104         bool remove(int k){
105             Node *p,*last;
106             if(!findPos(k,p,last))
107                 return false;
108             last->next=p->next;
109             return true;
110         }
111         Node **getArray(){
112             return hs;
113         }
114     private:
115         int divitor;
116         int tableSize;
117         Node **hs;
118 };
119 
120 void test(Node *&q){
121     q=new Node(4);
122 } 
123 int main(){
124     //闭散列法 
125 //    ArrayHashTable *hs=new ArrayHashTable(11,12);
126 //    int a[]={37,25,14,36,49,68,57,11};
127 //    for(int i=0;i<8;i++)
128 //        hs->insert(a[i]);
129 //    int *array=hs->getArray();
130 //    for(int i=0;i<12;i++){
131 //        cout<<array[i]<<" ";
132 //    }
133 //    delete hs;
134 
135     //开散列法 
136 //    LinkedHashTable *hs=new LinkedHashTable(11,12);
137 //    int a[]={37,25,14,36,49,68,57,11};
138 //    for(int i=0;i<8;i++)
139 //        hs->insert(a[i]);
140 //    Node **array=hs->getArray();
141 //    for(int i=0;i<12;i++){
142 //        Node *p=array[i]->next;
143 //        while(p!=NULL){
144 //            cout<<p->data<<" ";
145 //            p=p->next;
146 //        }
147 //        cout<<endl;
148 //    }
149 //    delete hs;
150     return 0;
151 }

原文链接: https://www.cnblogs.com/ytz1996/p/6380060.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/248908

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午3:18
下一篇 2023年2月14日 上午3:18

相关推荐