首页 > 编程语言 >必学算法——哈希算法

必学算法——哈希算法

时间:2024-10-29 23:20:51浏览次数:3  
标签:int 题解 必学 ret 算法 哈希 include

目录

前言

哈希算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在一些公司面试题中都可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解哈希算法。
在这里插入图片描述

一、什么是哈希算法

哈希算法,也称为散列算法,是一种数学函数或算法,它能够将任意长度的数据(称为“消息”)转换为固定长度的字符串(称为“哈希值”或简称“哈希”)。

二、哈希算法的原理

哈希算法的原理是将输入的数据按照一定的规则进行运算,从而得到一个固定长度的输出。具体来说,算法会将输入的数据分割成若干个等长或不等长的块,每个块称为一个消息块。然后,对每个消息块进行一系列的位运算、移位运算、模运算、异或运算等,从而得到一个中间结果,称为一个消息摘要。最后,将所有消息摘要进行组合或再次运算,从而得到最终的输出,即哈希值。

三、哈希算法的特点

1.高效性:计算速度快,能够快速生成哈希值。

2.唯一性:不同的输入数据生成的哈希值几乎不可能相同(尽管存在极小的碰撞概率)。

3.不可逆性:根据哈希值无法推导出原始输入数据,这是哈希算法的重要安全特性。

四、哈希算法的应用场景

1.数据安全:哈希算法可以用来验证数据的完整性和来源,例如数字签名、校验和、指纹等。通过比较数据经过哈希算法得到的哈希值是否相同,可以判断数据是否被篡改或伪造。

2.数据检索:哈希算法可以用来构建高效的数据结构,例如哈希表、布隆过滤器、默克尔树等。通过使用哈希值作为键或节点,可以实现快速的数据插入、删除和查找。

3.数据分片:在分布式系统中,哈希算法可以用于数据分片,以便将海量数据分布到多台机器上进行并行处理。

4.负载均衡:通过哈希算法,可以对客户端IP地址或会话ID计算哈希值,然后将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。这样可以实现会话粘滞的负载均衡策略。

5.分布式存储:在分布式存储系统中,哈希算法可以用于确定数据的存储位置。例如,通过哈希算法对数据取哈希值,然后对机器个数取模,得到的最终值就是应该存储的缓存机器编号。此外,一致性哈希算法还可以解决机器扩展时的数据迁移问题。

五、经典例题

1.字符统计

(帅哥这个蓝色字体可以点进去看原题)

代码题解

#include <iostream>
#include<string>
#include<unordered_map>
using namespace std;
int main()
{
    string s;
    cin >> s;
    int hash[256] = {0};//用于记录每个字母出现次数
    for(int i = 0; i < s.size(); i++){
        hash[s[i]]++;
    }
    int maxc = 0;
    char ret[256];//结果数组用于存储出现次数最多的字母
    int retSize = 0;//最长字母个数
    for(char c = 'A'; c <= 'Z'; c++){
        if(hash[c] > maxc){
            maxc = hash[c];
            retSize = 0;//如果发现更长的字母就把结果数组长度变为0,0下标的值变成新的最多字母
            ret[retSize++] = c;
        }
        else if(hash[c] == maxc){//如果发现最长字母的个数一样多就把这个字母插入结果数组
            ret[retSize++] = c;
        }
    }
    ret[retSize] = '\0'; //把这个结果数组变成字符串
    cout << ret << endl;
    return 0;
}

2.字符串统计

(帅哥这个蓝色字体可以点进去看原题)

代码题解

#include <iostream>
#include<string>
#include<unordered_map>
using namespace std;
int main()
{
  // 请在此输入您的代码
  unordered_map<string,int> m;
  int n;
  cin>>n;
  string s;
  for(int i=0;i<n;i++){
    cin>>s;
    m[s]=1;//给该键标记存在了
  }
  cout<<m.size()<<endl;
  return 0;
}

3.优质数对

(帅哥这个蓝色字体可以点进去看原题)

代码题解

#include <iostream>
#include<unordered_map>
using namespace std;
#define ll long long
#define sb 1000000001
int a[100001],b[100001];

int main()
{
  // 请在此输入您的代码
  int n;
  cin>>n;
  for(int i=0;i<n;i++)cin>>a[i];
  for(int i=0;i<n;i++)cin>>b[i];
  unordered_map<ll,int>h;
  ll ret=0;
  for(int j=0;j<n;j++){//a[i]=b[j] b[i]=a[j],优质数对的条件
    ll x=(ll)a[j]*sb+b[j];//哈希表的查找过程
    ret+=h[x];
    ll y=(ll)b[j]*sb+a[j];//哈希表的插入过程
    h[y]++;
  }
  
  cout<<ret<<endl;
  return 0;
}

六、结语

学习算法是一个很艰难,漫长的过程,我们要克服一切困难,学习算法本就是由易到难,我相信通过我们坚持不懈的努力一定能理解并熟练掌握其中细节,加油,我相信你一定能行。
在这里插入图片描述
关注我让我们一起学习编程,希望大家能点赞关注支持一下,让我有持续更新的动力,谢谢大家。
在这里插入图片描述

标签:int,题解,必学,ret,算法,哈希,include
From: https://blog.csdn.net/ycs66/article/details/143351448

相关文章

  • openssl enc内部算法实现原理
    我们都知道使用命令openssl时可以使用-enc指定算法,那么具体它的实现原理是什么呢?我们通过实验来一探究竟我们新建一个my.txt里面的内容为12345678opensslenc-aes-128-cbc-inmy.txt-outmy.enc-k"mypasswd"结果会生成my.enc文件,我们用xxd命令可以看到那么这个文件是如......
  • 0x02 Leetcode Hot100 哈希
    前置知识掌握每种语言的基本数据类型及其时间复杂度。Python:list、tuple、set、dictC++:STL中的vector、set、mapJava:集合类中的List、Set、Map为什么是哈希?在不同语言中,对于字典(dict)类的数据都会先将其键(key)进行哈希(Hash)运算,这个Hash值决定了键值对在内存中的存储位置,因此......
  • 手写fft算法,和内置fft算法对比
    好的,下面我将提供一个完整的Python示例,包括手写FFT算法(快速傅里叶变换)和使用NumPy的内置FFT算法,然后对比两者的结果并绘制图形。1.手写FFT算法我们将实现一个简单的FFT算法,即Cooley-Tukey算法,这是一种最常用的FFT算法。2.NumPy内置FFT算法NumPy库提供了一个非常高效的FFT实......
  • Offer68题 Day2 树的基础算法
    1.前中后序递归遍历//前序遍历classSolution{public:voidtraversal(TreeNode*cur,vector<int>&vec){if(cur==NULL)return;vec.push_back(cur->val);//中traversal(cur->left,vec);//左traversal(cur-&g......
  • 朱刘算法
    1问题我们知道带权无向图上有一个经典问题:最小生成树。那么如果换成带权有向图呢?对于一个带权有向图,从中选出一个子图,使得该子图中无环,且存在一个点可以到达其他所有点,则这个子图就是一个树形图。而求出所有树形图中选出边权和最小的一种选法,就是最小树形图问题。容易想到,解决......
  • Offer68题 Day3 两个基础算法
    1.DFS深度优先算法/* -深度优先算法 DFS从起始节点出发,沿着一条路径尽可能深入地访问每个节点,直到无法继续时再回退,寻找未访问的节点。 -使用递归实现。*/#include<iostream>#include<vector>usingnamespacestd;voidDFS(intnode,vector<vector<int>>&gra......
  • 代码随想录算法训练营day30| 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.
    学习资料:https://programmercarl.com/0452.用最少数量的箭引爆气球.html重叠区域问题最远位置问题452.用最少数量的箭引爆气球(重叠区域;按左边界排序;i区间的左边界与i-1区间的右边界比较来确定是否重叠;更新i的右边界,取i与i-1区域右边界的最小值)点击查看代码classSolution(ob......
  • 算法刷题记录(day5)
    LC160.相交链表题目描述:给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。classSolution{public:ListNode*getIntersectionNode(ListNode*headA,ListNode*headB){if(head......
  • 字符串匹配-KMP算法实现代码
    字符串的基本操作同上一篇BF算法一致一.为模式串创建临时数组//KMP算法//1)为模式串创建临时数组voidcomputeLPSArray(char*pat,intM,int*lps){ //指向首元素 intj=0; //指向首元素的下一个元素 inti=1; //临时数组的首元素总为0 lps[0]=0; //结束条......
  • 【算法】分治算法-让问题消失
    博主推荐!!!:"近期我偶然邂逅了一个极为出色的人工智能学习平台,它不仅内容深入浅出,讲解方式还风趣幽默,让人学习起来既轻松又高效。如此宝藏资源,我迫不及待想要与各位共享,让我们一起进入这个精彩纷呈的学习网站吧!"即刻点击https://www.captainbed.cn/cyy算法系列:今天,我们要聊的......