哈希查找
哈希表
哈希函数
理想的情况下是不希望经过任何比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。因而在查找时,只需要根据这个对应关系f找到给定值K的像f(K)。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需要进行比较便可以直接存取所查记录。我们称这个对应关系为哈西函数,按这个思想建立起来的表称为哈希表。
哈希函数是一个映像,因此哈西函数的设定很灵活,只要使得任何关键字由此所得的哈希函数值都落在表长允许范围之内即可。对不同关键字可能得到同一哈希地址。key1!=key2,but f(key1)=f(key2),such a phenomenon is called collision.
Possess the same function value for the hash function is called synonym.
9.3.2 The method to construct hash function:
直接定址法
数字分析法
平方取中法
折叠法
除留余数法
随机数法
9.3.3 The method to handle collision.
开放定址法
再哈希法
链地址法
建立一个公共溢出区
9.3.4 Hash Table Search and Analysis
//开放定址哈希表的存储结构
int hashsize[]={997,...};
typedef struct
{
ElemType *elem;
int count;
int sizeindex;
}HashTable;
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
在哈希表上查找的过程和哈希函数建立的过程基本一致。给定K值,根据造表时设定的哈希函数求得哈希地址,若表中此位置上没有记录,则查找不成功,否则比较关键字,若和给定值相等,则查找成功,否则根据造表时设定的处理冲突的方法找“下一地址”,直至哈希表中某个位置为“空”或者表中所填记录的关键字等于给定值时为止。
虽然哈希表在关键字与记录的存储之间建立了直接映像,但由于“冲突”的产生,使得哈希表的查找过程仍然是一个给定值和关键字进行比较的过程。因此,仍然以平均查找长度作为衡量哈希表的查找效率的量度。
查找过程中需和给定值进行比较关键字的个数取决于下列三个因素:哈希函数,处理冲突的方法和哈希表的装填因子。