首页 > 其他分享 >哈希表

哈希表

时间:2023-07-31 22:55:25浏览次数:35  
标签:return int 位置 查找 哈希 字符串

  • 哈希表

    • 作用:将庞大的空间,映射到小的空间,集中数据,一般用取模,取模的数尽量取质数,最大程度减小冲突
    • 操作:一 般是添加和查找元素,删除元素通常有一个标记数组,对元素标记为已删除
    • 离散化相似,离散化是特殊的哈希方式,离散化处理的数据是单调的,相对位置不变
    • 映射会出现冲突,如将两个不同的数映射成同一个数
    • 存储结构:

      • 解决了冲突
      • 开放寻址法

        • 仅仅一个数组,数组长度通常为最大范围的2~3倍
        • 存储:当前位置有元素,就移到下一个位置,直到当前位置无元素为止
        • 查找:当前位置有元素且不为x,就移动到下一个位置,直到当前位置是x,后返回下标
        • 代码:
          const int N = 2e5 + 3;
          const int null = 0x3f3f3f3f;//表示无穷大
          int h[N];
          //查找 可以插入的/查找到的位置
          void find(int x){
          	int k = (x % N + N) % N;//第一个哈希的位置
          	while(h[k] != null && h[k] != x){//当前位置有元素且不为x
          		k ++ ;//后移
          		if(k == N) k = 0;//循环找位置
          	}
          	return k;//返回可以插入的位置,或者查找到x的位置
          }
          int k = find(x);//返回一个可以插入的或者查找到的位置
          //插入
          if(h[k] == null) h[k] = x;//当前位置为空可以插入
          //查询
          if(h[k] != null) return found//当前位置不空必为x
          else return not found //当前位置为空,查找不到x
          memset(h, 0x3f, sizeof h);
          
      • 拉链法

        • 冲突的元素存入当前位置的链表中,因此同一个下标就可以存下不同的元素解决冲突
        • 代码:
          const int N = 1e5 + 3; //质数
          int h[N], e[N], ne[N], idx = 1;//链表节点从1开始,0代表空节点
          //添加
          void insert(int x){
          	int k = (x % N + N) % N;//x可能为负数,结果相当于|x| % N
          	e[idx] = x;
          	ne[idx] = h[k];
          	h[k] = idx;
          	idx ++ ; 
          }
          //查询
          void find(int x){
          	int k = (x % N + N) % N;
          	for(int i = h[k]; i; i = ne[i])
          		if(e[i] == x) return true;
          		else return false;
          }
          
    • 字符串哈希方式

      • 字符串前缀哈希法
      • 将字符串的每个字符映射为某个数(asic码),该数不能为0,并且将该数看作p进制下的一位,求出它的十进制的值,该值就代表字符串的映射值,然后将该值对q取模,成为字符串的哈希值
      • 一般取p = 131 或者 13331, 取q = 2^64, 可以大概率减少冲突,不考虑冲突
      • 用unsigned long long 存储每个字符串的映射值,自然溢出相当于对q取模
      • 求出某个字符串的前缀哈希值,则该字符串的任一子串的哈希值可以做差求出(类似前缀和)
      • 代码:
        typedef unsigned long long ULL;
        const int N = 1e5 + 10;
        const int P = 131; //P进制
        char str[N];
        ULL h[N], p[N];//h存储字符串前缀哈希值,p[i]存储P进制下的P^i的值
        //取字串的哈希值
        ULL gets(int l, int r){
        	return h[r] - h[l - 1] * p[r - l + 1];
        }
        
        //递推预处理p^i, 字符串前缀哈希值
        p[0] = 1;
        for(int i = 1; i <= n; ++ i){
        	p[i] = p[i - 1] * P;
        	h[i] = h[i - 1] * P + str[i]; //求前i个字符组成的字符串的哈希值(字符串前缀哈希值)
        }
        

标签:return,int,位置,查找,哈希,字符串
From: https://www.cnblogs.com/moilip/p/17595216.html

相关文章

  • [代码随想录]Day05-哈希表 part01
    题目:242.有效的字母异位词思路:很简单,就是看两个字符串每个字母出现的次数是不是相同的。可以用两个数组来比较,也可以用一个数组比较。代码:一个数组funcisAnagram(sstring,tstring)bool{isExist:=[26]int{}//26个字母for_,ch:=ranges{isE......
  • 代码随想录-哈希表-c++总结
    哈希表内容整体简单,关键是要有利用map映射的思想,以及巩固一些c++标准库的操作这次三数之和一题没有直接做出来,关键在于如何查重一点比较绕15.三数之和-力扣(LeetCode)利用排序+双指针解决三数之和的思路更加清楚此外,四数之和中,四个数相加会溢出int,应改为 ......
  • 哈希函数如何工作 ?
    动动发财的小手,点个赞吧!作为一名程序员,您每天都会使用哈希函数。它们在数据库中用于优化查询,在数据结构中用于使速度更快,在安全性中用于保证数据安全。几乎每次与技术的交互都会以某种方式涉及哈希函数。哈希函数是基础函数,而且无处不在。但什么是哈希函数,它们如何工作?在这篇文......
  • 【算法】哈希学习笔记
    1.哈希(hash)简介1.1前言又来写算法总结了qwq。今天是2023/7/8,期末考试已经考完了。初二下注定是一个煎熬的学期,所以我在这一学期并没有学什么新算法,OI也没什么长进。但倒是深造了几个算法,比如:dp,hash,线段树。之前一直想写一篇hash的学习笔记,但由于种种原因,并没有写成。于......
  • 41. 缺失的第一个正数(原地哈希)
    给你一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案。示例1:输入:nums=[1,2,0]输出:3>思路原地哈希就相当于,让每个数字n都回到下标为n-1的家里。而那些没有回到家里的就成了孤魂野鬼......
  • Template <字符串哈希>
    #include<iostream>#include<string>#include<vector>usingnamespacestd;usingULL=unsignedlonglong;//字符串哈希(注意get(l,r)为闭区间,字符串下标从1开始)structStringHash{vector<ULL>h;//哈希数组vector<ULL>p;//p[i]=P......
  • 在Java和C#中计算SHA-1哈希
    Java版本:publicvoidtestHash(){Stringpassword="Test";byte[]key=password.getBytes();MessageDigestmd=MessageDigest.getInstance("SHA-1");byte[]hash=md.digest(key);Stringresult="";for(byteb:hash){res......
  • 【原创】在 VBScript 中使用哈希表(Hashtable)
    环境要求WindowsXP及以上。Windows10、Windows11在Windows功能中勾选.NETFramework3.5(包括.NET2.0和3.0)。使用创建一个Hashtable对象:SetoHT=CreateObject("System.Collections.Hashtable")Count属性:返回表中键值对的数量SetoHT=CreateObj......
  • 利用Pollard rho进行哈希碰撞(Polladr rho method to fing collision)
    项目实现:implementtheRhomethodofreducedSM3实验内容:该实验设计f函数为\(f:H(x)\),即\(W_i=H(W_{i-1})\)(除第一次输入信息\(m\)外,f函数输入输出均为256bit)Polladrrhomethodtofingcollision:利用了生日悖论,使碰撞的复杂度降到\(O(\sqrtn)\)级别,同时能有效避免......
  • 3 哈希表
    #哈希表##1哈希表理论基础###1.1什么是哈希表>哈希表(hashtable):根据关键码的值而直接进行访问的数据结构。![img](https://img2023.cnblogs.com/blog/3237570/202307/3237570-20230719105359176-1676757602.png)-hash表解决问题:快速判断一个元素是否出现集合......