哈希表
哈希表是一种高效的数据结构。它的最大优点就是把数据存储和查找和所消耗的
时间大大减少,几乎可以看成是O(1),而代价是消耗较多的内存。
哈希表的基本原理
哈希表的基本原理是使用一个下标范围比较大的数组A来存储元素,设计一个函
数h,对于要存储的线性表的每个元素node,取一个关键字key,算出一个函数值h(key),
把h(key)作为数组下标,用A[h(key)]来存储node。
冲突处理
由于不能保证每个元素的关键字与函数值是一一对应的,对于不同元素计算产生同样
的函数值,就要进行相应处理。
基本的方法有:
1)拉链法:当冲突出现时,就拉出一条链,建立链接的方式的子表。
2)开地址法:在冲突发生时,用某种方法在基本存储区域内形成一个探寻序列,直到找到
空闲的地址。
哈希函数的相关操作
void init_hashtable(int *arr, int size)//初始化hashtable
{
int i;
for(i = 0; i < size; i++)
arr[i] = -1;
}
int hash(int value, int size)
{
return value % size;//除余法
}
int locate(int *arr, int size,int value)
{
int index,i;
index = hash(value);
i = 0;
while(i < size && arr[(index + i) % size] != value && arr[(index + i)%size] != -1 )
i++;//出现冲突,采用开地址法,向下一位探寻是否冲突
return (index + i) % size;
}
int insert_table(int *arr, int size, int value)
{
int index = locate(arr,size,value);
if(arr[index] == -1)
arr[index] = value;
else//table满了或者是此元素已经存在
return -1;
return 1;
}
int search_table(int *arr, int size, int value)
{
int index = locate(arr,size,value);
if(arr[index] == value)
return index;
return -1;
}