第1关:什么是哈希表
任务描述
本关任务:学习哈希函数的构造,处理冲突的方法。
选择题
1、设哈希表长为8,哈希函数为Hash (key)=key%7。初始记录关键字序列为(32,24,15,27,20,13),用链地址法作为解决冲突方法的平均查找长度是( B )
A、1.4
B、1.5
C、1.6
D、1.7
2、哈希查找中k个关键字具有同一哈希值,若用线性探测法将这k个关键字对应的记录存入哈希表中,至少要进行(C)次探测。
A、k
B、k+1
C、k(k+1)/2
D、1+k(k+1)/2
3、下列不是哈希冲突的解决方法的选项是?(C)
A、开放定址法
B、再哈希法
C、分支限界法
D、链地址法
第2关:哈希表的基本操作
任务描述
本关任务:学习哈希表的查找算法,实现哈希表的基本操作的程序。
测试说明
平台会对你编写的代码进行测试。
代码如下
#include <stdio.h>
#include <stdlib.h>
#define HASHSIZE 7 //定义散列表长为数组的长度
#define NULLKEY -1
typedef struct{
int *elem;//数据元素存储地址,动态分配数组
int count; //当前数据元素个数
}HashTable;
//对哈希表进行初始化
void Init(HashTable *hashTable){
int i;
hashTable->elem= (int *)malloc(HASHSIZE*sizeof(int));
hashTable->count=HASHSIZE;
for (i=0;i<HASHSIZE;i++){
hashTable->elem[i]=NULLKEY;
}
}
//哈希函数(除留余数法)
int Hash(int data){
return data%HASHSIZE;
}
//哈希表的插入函数,可用于构造哈希表
void Insert(HashTable *hashTable,int data){
int hashAddress=Hash(data); //求哈希地址
//发生冲突
while(hashTable->elem[hashAddress]!=NULLKEY){
//利用开放定址法解决冲突
hashAddress=(++hashAddress)%HASHSIZE;
}
hashTable->elem[hashAddress]=data;
}
//哈希表的查找算法
int Search(HashTable *hashTable,int data){
/********* begin *************/
int hashAddress=Hash(data); //求哈希地址
while(hashTable->elem[hashAddress]!=data){//发生冲突
//利用开放定址法解决冲突
hashAddress=(++hashAddress)%HASHSIZE;
//如果查找到的地址中数据为NULL,或者经过一圈的遍历回到原位置,则查找失败
if (hashTable->elem[hashAddress]==NULLKEY||hashAddress==Hash(data))
return -1;
}
return hashAddress;
/********* end ***************/
}
int main(){
int i,result;
HashTable hashTable;
int arr[HASHSIZE]={13,29,27,28,26,30,38};
//初始化哈希表
Init(&hashTable);
//利用插入函数构造哈希表
for (i=0;i<HASHSIZE;i++){
Insert(&hashTable,arr[i]);
}
//调用查找算法
result= Search(&hashTable,29);
if (result==-1) printf("查找失败");
else printf("29在哈希表中的位置是:%d",result+1);
return 0;
}