散列,字符串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

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

相关文章
|
算法 机器学习/深度学习 数据安全/隐私保护
murmur3哈希算法
murmur3哈希算法 murmur3非加密哈希算法 murmur3非加密哈希算法导图 据算法作者Austin Appleby描述,有c1, c2, n 三个常量用大量测试数据调测出来的,可以对数值进行微调。
14508 0
|
21天前
|
存储 安全 算法
散列哈希
【10月更文挑战第16天】
|
5月前
|
存储 算法 Java
哈希算法篇 - 布隆过滤器
哈希算法篇 - 布隆过滤器
52 1
|
6月前
|
存储 算法 安全
哈希算法
哈希算法是单向加密技术,将任意数据转化为固定长度的唯一摘要。特征包括确定性、快速性、雪崩效应和单向性。应用广泛,如数据完整性校验、密码存储和哈希表。常见算法有MD5、SHA-1、SHA-256,选定时需注意安全性和抗碰撞能力。
60 3
|
存储 算法 数据处理
哈希(散列)查找算法
本文主要是散列表的认识与哈希查找!
236 1
|
存储 算法 安全
哈希算法介绍
哈希算法是一种将任意长度的数据映射为固定长度的固定大小值的算法。它是一种单向函数,即无法从哈希值反推出原始数据。哈希算法在密码学、数据完整性校验、数据索引等领域有广泛的应用。
192 0
|
存储 算法 C++
|
算法 Serverless C++
|
算法 安全 PHP
Hash算法详细介绍与实现(一)
Hash表(HashTable)又称散列表,通过把关键字Key映射到数组中的一个位置来访问记录,以加快查找速度,这个映射函数称为Hash函数,存放记录的数组称为Hash表.散列表是散列函数的一个主要应用(注意:关键字不是像在加密中所使用的那样是秘密的,但它们都是用来"解锁"或者访问数据的。)例如,在英语字典中的关键字是英文单词,和它们相关的记录包含这些单词的定义。在这种情况下,散列函数必须把按照字母顺序排列的字符串映射到为散列表的内部数组所创建的索引上。
376 1
|
算法 安全 数据安全/隐私保护
哈希函数/散列算法
哈希函数(Hash function),又称散列函数、散列算法,它是一种不可逆的信息摘要算法,具体实现就是把任意长度的输入信息通过哈希算法变成固定长度的输出信息。
241 0