Hash Table
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;
}
结果
最终结果在最后一行: