散列,字符串hash初步

简介: 散列,字符串hash初步

散列是一种以空间换时间的算法思想,以整数散列为列,其精髓就在于用其一个整数数组的下标对应操作输入的对象,要查找这个对象,就直接查找其对应的下标里面信息。

举个例子: 随便输入n个数a(0-100),再输入m个数b,查询他们在这n个数中出现了几次?

这个时候我们建立一个101大的整数数组t初始为0,直接以数组下标标识0-100的数,输入a时,令t[a]++就代表那个数查询了,查询的时候也方便,t[b]大小就是b出现的次数。

再问: 如果关键词不是整数,而是字符串或坐标等别的数据怎么办?

这时候,就要体现散列的精髓了- hash函数的构造,下面以字符串为例:

现在输入的不是数了,而是3个小写字母的单词,应该怎么办?

分析小写字母是a-b,共26位,如果把它们考虑成一个26进制数,转化为十进制就会有一个唯一十进制数与之对应,借此思想我们设计程序如下:


#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=26*26*26+1;
int t[maxn]={0};
int hashfunc(char s[],int n) {  //将字符串转化为十进制数,hash函数 
  int id=0;
  for(int i=0;i<n;i++)
  id=id*26+(s[i]-'a');
  return id;
}
int main(){
  char s[3];
  int n;
  cin>>n;
  for(int i=0;i<n;i++)
  {   
    for(int j=0;j<3;j++)
    cin>>s[j];
    t[hashfunc(s,3)]++;
  }
  for(int j=0;j<3;j++)
    cin>>s[j];  
  cout<<  t[hashfunc(s,3)]<<endl;
  return 0;
}

一个结果:

1685014611339.jpg

显然,如果一个字符串数据太大,这样就不太适合,至于处理方法,我们将在字符串部分讲解

相关文章
|
7月前
|
存储 负载均衡 算法
哈希算法
哈希算法
|
算法 机器学习/深度学习 数据安全/隐私保护
murmur3哈希算法
murmur3哈希算法 murmur3非加密哈希算法 murmur3非加密哈希算法导图 据算法作者Austin Appleby描述,有c1, c2, n 三个常量用大量测试数据调测出来的,可以对数值进行微调。
14380 0
|
25天前
|
存储 Serverless C++
哈希的简单介绍
哈希的简单介绍
32 0
|
1月前
|
存储 缓存 Java
哈希表超详解
哈希表超详解
|
6月前
|
存储 缓存 算法
一篇文章让你学会什么是哈希(上)
哈希概念 哈希在C++中有广泛的应用,它是一种用于快速查找和存储数据的数据结构和算法。以下是一些常见的哈希在C++中的应用: 哈希表(Hash Table):哈希表是一种高效的数据结构,用于存储键值对。在C++中,std::unordered_map 和 std::unordered_set 是标准库提供的哈希表实现。
|
9月前
|
存储 Serverless C++
哈希(C++)上
哈希(C++)
59 0
|
9月前
多阶哈希
多阶哈希
87 0
|
6月前
|
存储 Serverless 索引
|
9月前
|
存储 算法 安全
哈希算法介绍
哈希算法是一种将任意长度的数据映射为固定长度的固定大小值的算法。它是一种单向函数,即无法从哈希值反推出原始数据。哈希算法在密码学、数据完整性校验、数据索引等领域有广泛的应用。
136 0
|
9月前
|
存储 算法 编译器
【C++】哈希
unordered系列容器的使用、哈希表的底层结构及其模拟实现