散列存储(双重散列)
双重散列采用如下形式的散列函数:
H(k,i) = ( h1(k) +i*h2(k) ) mod m
H2(k)必须与表的大小M互为素数!!
方法:
1) 取M为2的幂,并设计一个总产生奇数的h2
2) 取M为素数,并设计一个总是返回较m小的正整数的函数h2
h1(k) = k mod m
h2(k) = 1+ ( k mod m’)
代码:
#include<stdio.h>
#include<assert.h>
#include<math.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define SUCCESS 1
#define UNSUCCESS 0
#define HASHBIAOSIZE 15 //决定散列表大小的参数
#define M 11 //这里要取素数!!!
#define NULLKEY -65535
#define Hash(v) (v % 9) //h1(k)
#define Hash2(v) ((v % 7) + 1) // h2(k)
//----------------------------------------------------------------------------//
typedef struct HashTable
{
int* element;//
int count;//
} HashTable;
int m=0;
void InitHashTable(HashTable *H);
void InsertHashKey(HashTable* H,int key);
int Hash_f(int key);
int HashTabelSearch(HashTable* H,int key);
//----------------------------------------------------------------------------//
int main()
{
int a[]= {1,12,5,4,6,8,7,45,21,13,18};
HashTable H;
//初始化!!
InitHashTable(&H);
for(int i=0; i<M; i++){
InsertHashKey(&H,a[i]);
}
for(int j=0; j<M; j++)
{
if(HashTabelSearch(&H,a[j]) == -1)
printf("没查找到\n");
else
printf("查找元素%d存储的标号%d\n",a[j],HashTabelSearch(&H,a[j]));
}
return 0;
}
//----------------------------------------------------------------------------//
void InitHashTable(HashTable *H)
{
m=HASHBIAOSIZE;
H->element=(int*)malloc(m*sizeof(int));
H->count=HASHBIAOSIZE;
for(int i=0; i<m; i++)
{
H->element[i]=NULLKEY;
}
}
//----------------------------------------------------------------------------//
//存储元素
//这里采用取余数法
void InsertHashKey(HashTable* H,int key){
int addr=Hash_f(key);
while(H->element[addr]!=NULLKEY){ //冲突了
addr=(addr+1)%M;//解决冲突
}
H->element[addr]=key;
}
//----------------------------------------------------------------------------//
//查找元素
int HashTabelSearch(HashTable* H,int key)
{
int hash_key = Hash(key);
int hash_key2 = Hash2(key);
int temp = 0;
while (H->element[hash_key] != NULLKEY) {
if( H->element[hash_key] == key )
break;
temp = hash_key;
hash_key = (hash_key+hash_key2) % M;
//这里是检验会不会出现怎么加都不会变的情况,不过一般不会有!
if( hash_key == temp )
return -1;
}
return hash_key;
}
//----------------------------------------------------------------------------//
int Hash_f(int key){
return key%M;
}
//----------------------------------------------------------------------------//