算法初步——散列
2018-01-09 11:32
148 查看
散列的定义与整数散列
- 题目要求:M个预查询的数中每个数在N个数中出现的次数
思路:设定一个int型数组 hashTable[10010] ,然后在输入 N 个数时进行预处理,即当输入的数为 x 时 ,就令 hashTable[x]++,时间复杂度为 O(N+M)
#include <cstdio> #include <string> #include <algorithm> #include <cmath> using namespace std; const int maxn = 100010; int hashTable[maxn] = {0}; int main() { int n, m, x; scanf("%d%d", &n, &m); for(int i=0; i<n; ++i) { scanf("%d", x); hashTable[x]++; // 记录每个数出现次数 } for(int i=0; i<m; ++i) { // 输出 M 个数中每个数在 N 个数中出现的次数 scanf("%d", x); printf("%d\n", hashTable[x]); } return 0; }
字符串hash初步
- 先假设字符串均由大写字母 A~Z 构成 不妨把 A~Z 视为 0~25 ,这样就把26个大写字母对应到二十六进制中
- 接着按照将二十六进制转换为十进制的思路,便可实现将字符串映射为整数的需求
int hashFunc(char S[], int len) { // hash 函数,将字符串 S 转换为整数 int id = 0; for(int i=0; i<len; ++i) { id = id*26 + (S[i]-'A'); // 将二十六进制转换为十进制 } return id; }
-
那么可以把 A~Z 视为 0~25 ,而把 a~z 视为 26~51
int hashFunc1(char S[], int len) { // hash 函数,将字符串 S 转换为整数 int id = 0; for(int i=0; i<len; ++i) { if(S[i] >= 'A' && S[i] <= 'Z') { // 大写字母 id = id*52 + (S[i] -'A'); } else if(S[i] >= 'a' && S[i] <= 'z') { // 小写字母 id = id*52 + (S[i] -'a') + 26; } } return id; }
-
按照小写字母的处理方法,增大进制数至62
int hashFunc2(char S[], int len) { // hash 函数,将字符串 S 转换为整数 int id = 0; for(int i=0; i<len-1; ++i) { id = id*26 + (S[i]-'A'); // 将二十六进制转换为十进制 } id = id*10 + (S[len-1] - '0'); // 拼接末位 return id; }
-
思路:将字符串转换为整数,然后利用上面的整数散列解决该问题
#include <cstdio> #include <string> #include <algorithm> #include <cmath> using namespace std; const int maxn = 100; char S[maxn][5], temp[5]; int hashTable[26*26*26 + 10] = {0}; int hashFunc(char S[], int len) { int id = 0; for(int i=0; i<len; ++i) { id = id*26 + (S[i]-'A'); } return id; } int main() { int n, m; scanf("%d%d", &n, &m); for(int i=0; i<n; ++i) { scanf("%s", S[i]); int id = hashFunc(S[i], 3); // 将字符串转换为整数 hashTable[id]++; // 该字符串出现次数+1 } for(int i=0; i<m; ++i) { scanf("%s", temp); int id = hashFunc(temp, 3); // 将字符串 temp 转换为整数 printf("%d\n", hashTable[id]); // 输出该字符串出现次数 } return 0; }
相关文章推荐
- 【Visual C++】游戏开发笔记十七 游戏基础算法(一) 游戏随机系统初步
- 【算法学习笔记】08.数据结构基础 二叉树初步练习1
- 【算法竞赛入门经典】动态规划初步 例题9-7 UVa11584
- PageRank算法研究初步
- 算法---散列表
- 研究散列(Hashing)算法的体会
- 11.19 AS设置,maven初步,常用算法和设计模式初聊
- TAOCP(1):算法初步
- 【机器学习】从分类问题区别机器学习类型 与 初步介绍无监督学习算法 PAC
- 算法初步—散列—A1084
- 网上各种短网址算法应用的初步详细汇总
- 感知机学习算法初步1
- 算法初步—贪心—基本贪心问题详解
- 路径规划算法初步认识
- 算法分析与设计课程资料:蚂蚁算法的初步研究与计算机模拟
- 【Visual C++】游戏开发笔记十七 游戏基础算法(一) 游戏随机系统初步
- 【算法】算法初步:聊一聊常见排序的算法
- 机器学习与数据挖掘基本算法初步介绍
- 随机算法之拉斯维加斯算法及蒙特卡罗算法初步
- 24 点游戏的初步算法