1.散列查找的优点
查找数据时,不是通过一些列与关键字的比较,而是通过散列函数直接计算得到关键字保存的位置,然后直接读取即可。
2.散列技术的关键是:散列函数的选择和冲突解决方法。
1)散列函数选择标准:尽量选择能减少冲突的散列函数;
2)常见的散列函数:直接定址法,平方取中法,整除取余法等;
3)常见的冲突解决方法有:开放地址法,链接法等。
3.散列表结构和操作定义
HashSearch.h
#include<stdio.h>
#include<stdlib.h>
#define HASH_LEN 13
#define TABLE_LEN 8
//原始数据
int data[TABLE_LEN] = {69, 65, 90, 37, 92, 6, 28, 54};
//散列表,初始化为0
int hash[HASH_LEN] = {0};
/*---------------创建和查找散列表声明start------------------*/
//功能:创建散列表
void CreateHash(int hash[], int m, int data[], int n);
//功能:将关键字data插入散列表
void InsertHash(int hash[], int m, int data);
//功能:在散列表中查找
int HashSearch(int hash[], int m, int key);
/*---------------创建和查找散列表声明end------------------*/
/*---------------创建和查找散列表实现start------------------*/
//功能:创建散列表(m为散列表长度,n为数据个数)
/*关键:选择散列函数和冲突解决方法,本文用除法取余法作为散列函数,线性探测法为冲突解决方法*/
void CreateHash(int hash[], int m, int data[], int n){
int i;
for(i=0; i<n; i++)
InsertHash(hash, m, data[i]);
}
//功能:将关键字data插入散列表
void InsertHash(int hash[], int m, int data){
int i;
i = data % HASH_LEN; //散列函数:除法取余法
while(hash[i])
i = (++i) % HASH_LEN; //冲突解决方法:双散列探测法
hash[i] = data;
}
//功能:在散列表中查找(使用创建散列表时的散列函数和冲突解决方法)
int HashSearch(int hash[], int m, int key){
int i;
i = key % HASH_LEN; //计算关键字存储散列地址
while(hash[i] && hash[i] != key)
i = (++i) % HASH_LEN;
if(hash[i]==0) //查找失败
return -1;
else
return i;
}
/*---------------创建和查找散列表实现end------------------*/
4.散列查找测试
HashSearchTest.cpp
#include "HashSearch.h"
int main(){
int key;
int i, pos, select, len;
do{
printf("---------------------------\n");
printf("1.创建散列表 2.向散列表中插入数据\n");
printf("3.在散列表中查找数据\n");
printf("0.退出\n");
printf("请选择执行的操作序号:");
fflush(stdin);
scanf("%d", &select);
switch(select){
case 1:
printf("原数据:");
for(i=0; i<TABLE_LEN; i++)
printf("%d ", data[i]);
printf("\n");
CreateHash(hash, HASH_LEN, data, TABLE_LEN);
printf("散列表各元素的值为:");
for(i=0; i<HASH_LEN; i++)
printf("%d ", hash[i]);
printf("\n");
len = sizeof(hash) / sizeof(hash[0]);
printf("散列表长度为%d.\n", len);
break;
case 2:
printf("输入插入关键字:");
fflush(stdin);
scanf("%d", &key);
InsertHash(hash, HASH_LEN, key);
printf("新数据为:");
for(i=0; i<HASH_LEN; i++)
printf("%d ", hash[i]);
printf("\n");
break;
case 3:
printf("输入查找关键字:");
fflush(stdin);
scanf("%d", &key);
pos = HashSearch(hash,HASH_LEN, key);
if(pos>0)
printf("查找成功,该关键字位于数组的第%d个位置。\n", pos + 1);
else
printf("查找失败:");
break;
}
}while(select != 0);
system("pause");
return 1;
}