MOOC清华《程序设计基础》第8章:哈希算法与哈希链表
来源:互联网 发布:淘宝男童运动套装 编辑:程序博客网 时间:2024/06/07 07:16
一种将字符串映射成整数的简单哈希算法:
//累计异或得到哈希值——缺点:不同字符串有可能得到相同的哈希值 int Hash(const char* str) {int sum = 0;for(int i = 0; i < strlen(str); i++)sum ^= str[i];return sum;}// 网上检查文件真伪的MD5码也是一种哈希值吗?雷同概率有多大?//(人类的符号是有限的,所以组合结果也是有限的,必然有雷同)
对于文件“log.txt”的哈希算法的详细代码:
#include <iostream>#include <fstream>#include <cstring>using namespace std;struct Time_t //定义结构体 {int year, month, day;int hour, minute, second;};struct Node //定义链表结点(其实链表就是一种特殊的结构体) {Time_t tm;char id[20];char op[10]; //以上三行为数据域 Node* next; //这一行为指针域 };int Hash(const char* str) {int sum = 0;for(int i = 0; i < strlen(str); i++)sum ^= str[i];return sum;}void Insert(Node* hash_tab[], Node elem){//计算用户编号的哈希值int idx = Hash(elem.id);//添加新节点到链表头(成为新的头结点) Node* data = new Node;*data = elem;data->next = hash_tab[idx];hash_tab[idx] = data; }void Print(Node* list){//int cnt = 0; while(list) { //cout << cnt << ' ' << head->id << endl; cout << list->tm.year << '/' << list->tm.month << '/' << list->tm.day << ' ';cout << list->tm.hour << '/' << list->tm.minute << '/' << list->tm.second << ' '; cout << list->id << ' ';cout << list->op << endl;//cnt++; //head = head->next;list = list->next; } /*//修改为输出到文件ofstream fout("hash.txt");while(list) { //cout << cnt << ' ' << head->id << endl; fout << list->tm.year << '/' << list->tm.month << '/' << list->tm.day << ' ';fout << list->tm.hour << '/' << list->tm.minute << '/' << list->tm.second << ' '; fout << list->id << ' ';fout << list->op << endl;//cnt++; //head = head->next;list = list->next; } fout.close(); */ }void Output(Node* hash_tab[]){for(int i = 0; i < 256; i++){if(hash_tab[i] == NULL) continue;cout << i << ": ";Print(hash_tab[i]);cout << endl << endl;}/*//修改为输出到文件//ofstream fout("hash.txt");for(int i = 0; i < 256; i++){if(hash_tab[i] == NULL) continue;fout << i << ": ";Print(hash_tab[i]);fout << endl << endl;}//fout.close(); */}void Delete(Node* list){while(list){Node* tmp = list;list = list->next;delete tmp;}}void Release(Node* hash_tab[]){for(int i = 0; i < 256; i++){if(hash_tab[i] == NULL)continue;Delete(hash_tab[i]);hash_tab[i] = NULL;}}int main(){Node* list_tab[256] = {NULL};ifstream fin("log.txt");while(!fin.eof()){char tmp;Node data;//读入一行数据fin >> data.tm.year >> tmp >> data.tm.month >> tmp >> data.tm.day;fin >> data.tm.hour >> tmp >> data.tm.minute >> tmp >> data.tm.second;fin >> data.id;fin >> data.op;//添加至哈希链表Insert(list_tab, data); }fin.close();//输出哈希表内容Output(list_tab);//修改“输出哈希表内容”为“输出哈希表内容到文件”,本条语句不变,修改函数内容 //释放哈希表内存Release(list_tab);return 0; }
最终的最大哈希值为111。我企图更改代码为输出到文件,可是没有修改成功。我估计需要把一些函数拆开,放在一个函数里面,才能实现输出到文件的操作。否则函数与函数之间的文件操作互相干涉,会出错。
阅读全文
0 0
- MOOC清华《程序设计基础》第8章:哈希算法与哈希链表
- MOOC清华《程序设计基础》第5章第3题:用递归算法求最大公约数
- MOOC清华《程序设计基础》第5章第4题:用递归算法实现选择排序
- MOOC清华《程序设计基础》第5章第5题:用递归算法实现数组求和
- MOOC清华《程序设计基础》第5章:快速排序(不分配动态空间-算法一)
- MOOC清华《程序设计基础》第5章:快速排序(不分配动态空间-算法二)
- MOOC清华《程序设计基础》第5章:数字旋转方阵的填充-算法一
- MOOC清华《程序设计基础》第5章:数字旋转方阵的填充-算法二
- MOOC清华《程序设计基础》第5章:快速排序(不分配动态空间-算法三)
- MOOC清华《程序设计基础》第4章:筛法求素数
- MOOC清华《程序设计基础》第4章:筛法数人数
- MOOC清华《程序设计基础》第5章:归并排序
- MOOC清华《程序设计基础》第5章:青蛙过河问题
- MOOC清华《程序设计基础》第7章:读文件操作
- MOOC清华《程序设计基础》第7章:统计活跃用户数
- MOOC清华《程序设计基础》第8章第2题:从文件读取二进制、按位异或
- MOOC清华《程序设计基础》第8章:链表的基本概念
- MOOC清华《程序设计基础》第8章:链表的基本操作
- python 爬取 最好大学网 的大学排名
- 盒子模型
- Android Studio首次启动时出现unable to access android sdk add-on list的解决办法
- uva 714
- 8-1内部类的复习
- MOOC清华《程序设计基础》第8章:哈希算法与哈希链表
- Clocks Gym
- ACM——滑雪
- android面试题,各大企业常见的android面试题及答案(精华)
- 选择排序
- Yet Another Game of Stones---ZOJ Problem 3964
- java中的集合
- RecyclerView 源码分析
- APxxx系列wifi驱动芯片移植笔记