hash入门
来源:互联网 发布:农历日期 java代码 编辑:程序博客网 时间:2024/04/28 21:46
《挑战程序设计竞赛》P98
代码:
#include <bits/stdc++.h>using namespace std;const int M = 1046527;//必须是质数,这样可以比较好的避免hash冲突const int L = 14;//字符串的最大长度typedef long long LL;//样例输入://6 insrt AAA insert AAC find AAA find CCC insert CCC find CCCchar H[M][L];//保存字符串的数组//将一个字符串的每一个字符转成数字int char2num(char cha){ if (cha == 'A') return 0; else if (cha == 'C') return 1; else if (cha == 'G') return 2; else if (cha == 'T') return 3;}//将字符串转换成数字,这里面的P相当于是P进制LL getkey(char str[]){ LL sum = 0, p = 1, i; for (i=0;i<strlen(str); i++){ sum+=(p*char2num(str[i])); p*=4; } return sum;}int h1(int key){ return key%M;}int h2(int key){ return 1+(key%(M-1));}//查找函数 bool find1(char str[]){ LL key, h; key = getkey(str); for (int i=0; ;i++){ h = (h1(key)+i*h2(key))%M; if (strcmp(H[h], str) == 0) return true; else return false; }}//插入函数int insert1(char str[]){ LL key, h; key = getkey(str); for(int i=0; ;i++){ h = (h1(key)+i*h2(key))%M; if (strcmp(H[h], str) == 0) return 1; else if (strlen(H[h]) == 0){//一个括号的锅,我真是想操人,妈的为什么括号不匹配不报错啊!!!!!!!!!!!!!! strcpy(H[h], str); return 0; } }}int main(){ int i, n, h; char str[L], comand[9]; for (int i=0; i<M; i++) H[i][0] = '\0'; scanf("%d", &n); for (int i =0; i<n; i++){ scanf("%s %s",comand, str); if (comand[0] == 'i'){ insert1(str); } else { if (find1(str)){ cout<<"yes"<<endl; } else{ cout<<"no"<<endl; } } } return 0;}
核心的思想:将一个字符串转换成数字,通过数字来检索,效率是O(1)
难点:如何比较高效的得到一个数字(当输入的字符串数量较多时)(采取mod质数),以及h1()h2()函数的设计
阅读全文
1 0
- hash入门
- hdu_1425_sort ( hash 入门 )
- HASH入门 POJ1840
- hash简单入门
- hdu 1425 hash入门
- hash入门题
- poj1200 hash入门
- Hash 入门课堂笔记
- redis入门-hash常用命令
- redis入门-hash扩展命令
- POJ 1840 Eqs(简单hash入门)
- HDU 1880 字符串hash 入门题
- HDU 4821 String(hash入门题)
- poj3349 Snowflake Snow Snowflakes之hash入门
- POJ 1200 Crazy Search hash入门
- Perl语言入门(07 Hash)
- Redis入门(四)散列Hash
- hash
- [技能树] Mathjax与LaTex公式简介
- hadoop2.6.5 HDFS的高可用集群搭建
- s5pv210——定时器的知识和代码操作
- Service 详解
- connect调用失败后需关闭描述符
- hash入门
- 算法题——Course Schedule(C++)有向图求解BFS
- 动脑学院学习笔记-EventBus 3.0核心原理,打造事件分发框架
- 自定义user-agent的Middlware
- 堆排序
- jquery开发:jquery插件写法基础
- JavaScript学习笔记(第二天)
- python开源项目学习目录
- Andrew Ng机器学习week6(Regularized Linear Regression and Bias/Variance)编程习题