Hash Table

本文详细介绍了使用哈希表实现的功能,包括HashName用于构建姓名为键的数据结构,HASH_SEARCH用于查找学生信息,HASH_INSERT用于插入学生,HASH_DELETE用于删除学生,以及Evaluate计算平均查找次数。作者使用特定的冲突解决策略来处理哈希碰撞。
摘要由CSDN通过智能技术生成

1、HashName()函数:以姓名为关键字建表

代码

void HashTable::HashName(Data *data){   //以姓名为关键字建表
	int i = 1, key = 0;
	for(int t = 0; data->name[t] != '\0'; ++t) key += data->name[t];
	if(key < 0) key = -key;   //确保key为正 
	key %= HASH_SIZE;
	while(student[key]->flag == 1){   //当冲突,循环直至为空槽 
		key = ( ( ( 11 * (key % 32) ) >> 3 ) + (i++) * (key % 24 + 53) ) % HASH_SIZE;
	}
	name[num] = data->name;
	num++;
	student[key]->stu_num = data->stu_num;   //载入信息 
	student[key]->name = data->name;
	student[key]->major = data->major;
	student[key]->gender = data->gender;
	student[key]->flag = 1;
}

思路

文本输入时,文本编码为ANSI。key值可直接将data->name加和,然后除以HASH_SIZE取余,得到一个初始的key。

若该key值下以存有学生信息,则进入循环,直至遇到空槽。

  • 循环方法:

    我参考了课件中:

    h(k) = (A·k mod (2 ^ w)) rsh (w – r)

    自己经实验选取了几个参数(具体见上)。

最后将学生信息载入空槽,并改变flag值为1(初始为0)。


2、HASH_SEARCH(name)函数:查找姓名为 name 的学生,并返回相应信息

代码

int HashTable::HASH_SEARCH(string name){   //查找
	int i = 1, key = 0;   //i:记录循环次数,同时也作为参数参与"随机"建表 
	for(int t = 0; name[t] != '\0'; ++t) key += name[t];
	if(key < 0) key = -key;
	key %= HASH_SIZE;
	while( (student[key]->flag == 1) && (student[key]->name != name) ){
		key = ( ( ( 11 * (key % 32) ) >> 3 ) + (i++) * (key % 24 + 53) ) % HASH_SIZE;
		if(i > num){   //若已经遍历,则表内无该学生 
			cout << "未找到该学生" << endl; 
			return 0;
		}
	}
	cout << *student[key] << endl;   //输出学生信息 
	return i;   //返回循环次数 
}

3、HASH-INSERT()函数:插入一名学生的信息

代码

void HashTable::HASH_INSERT(string stu_num, string name, string major, string gender){
	Data *stu = new Data();
	stu->stu_num += stu_num;   //载入信息 
	stu->name += name;
	stu->major += major;
	stu->gender += gender;
	HashName(stu);   //将该学生插入表 
	delete stu;
} 

4、HASH-DELETE()函数:删除一名学生的信息

代码

void HashTable::HASH_DELETE(string name){     //删除
	int i = 1, key = 0;
	for(int t = 0; name[t] != '\0'; ++t) key += name[t];
	if(key < 0) key = -key;
	key %= HASH_SIZE;
	while( (student[key]->flag == 1) && (student[key]->name != name) ){
		key = ( ( ( 11 * (key % 32) ) >> 3 ) + (i++) * (key % 24 + 53) ) % HASH_SIZE;
		if(i > num){   //若已经遍历,则表内无该学生
			cout << "未找到该学生" << endl; 
			return;
		}
	}
	student[key]->stu_num = "";   //将需删除的学生信息清空 
	student[key]->name = "";
	student[key]->major = "";
	student[key]->gender = "";	
}

5、Evaluate()函数:计算对所有学生的平均查找次数

代码

float HashTable::Evaluate(){   //计算平均查找次数 
	float total = 0;
	for(int i = 0; i < num; ++i){
		total += HASH_SEARCH(name[i]);
	}
	return total / num;
}

结果

最终结果在最后一行:
最终结果在最后一行

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值