首页 > 其他分享 >哈希表

哈希表

时间:2023-04-29 19:22:57浏览次数:28  
标签:idx int long 哈希 表中 cases

\[哈希表 \begin{cases} 存储结构 \begin{cases} 开放寻址法 \\[2ex] 拉链法 \\[2ex] \end{cases} \\[3ex] 字符串哈希方式\\[3ex] \end{cases} \]



一般哈希

开放寻址法
//开放寻址法模板

const int N=(数据范围的2~3倍,质数),null=(数据范围外的数,常用0x3f3f3f3f);
int h[N];
memset(h,null,sizeof h);

//如果x在哈希表中,返回x的下标;如果x不在哈希表中,返回x应该插入的位置
int find (int x)
{
    int t=(x%N+N)%N;
    while(h[t]!=null&&h[t]!=x)
    {
        t++;
        if(t==N)t=0;
    }
    return t;
}

拉链法
//拉链法模板

int h[N],e[N],ne[N],idx;
memset(h,-1,sizeof h);	//将单数组每个点的指针初始化为空指针-1

//向哈希表中插入一个数
void insert (int x)
{
    int k=(x%N+N)%N;  //保证k为非负数
    e[idx]=x;
    ne[idx]=h[k];
    h[k]=idx++;
}

//在哈希表中查询某个数是否存在
bool find (int x)
{
    int k=(x%N+N)%N;
    for(int i=h[k];i!=-1;i=ne[i])
        if(e[i]==x)return true;
    return false;
}



字符串哈希

核心思想: 将字符串看成 p 进制数, p 的经验值是 13113331 , 取这两个值冲突概率低

小技巧: 取模的数用 \(2^{64}\) , 这样直接用 unsigned long long 存储, 溢出的结果就是取模的结果


//字符串哈希模板

const int p=131;
unsigned long long h[N],p[N];
//h[k]存储字符串前k个字母的哈希值,p[k]存储(p^k)%(2^64)

//初始化
p[0]=1;
for(int i=1;i<=n;i++)
{
    h[i]=h[i-1]*p+str[i];
    p[i]=p[i-1]*p;
}

//计算子串str[l~r]的哈希值
unsigned long long get (int l,int r)
{
    return h[r]-h[l-1]*p[r-l+1];
}


标签:idx,int,long,哈希,表中,cases
From: https://www.cnblogs.com/evilboy/p/17364387.html

相关文章

  • VC中实现哈希Hash算法
       Hash函数我们可以自己用C来编写,但是如果在VC中就不必了,因为在VC中有实现hash算法的函数可以调用,就是CryptAcquireContext函数,这个函数的定义在wincrypt.h头文件中。下面是我在MFC中实现的,因为想要结果输出到messagebox中,所以就在视类里定义和实现了GetHash函数来计算哈希值......
  • 【哈希表】LeetCode 895. 最大频率栈
    题目链接895.最大频率栈思路很容易想到使用map:valToFreq来记录每个值出现的频率,这是没问题的,但关键是如何通过频率寻找到应该返回的数。这时候我想到再加一个map:freqToVal来记录每个频率中出现的数字,为了符合题目返回最接近栈顶的元素的要求,freqToVal的键值对类型选择<......
  • 【哈希表】LeetCode 767. 重构字符串
    题目链接767.重构字符串思路先用哈希表统计出出现次数最多的字符,如果这个次数大于一半,说明这个字符总会挨在一起,直接返回""。如果不超过一半,则先把字符填在偶数位置(先填出现次数最多的字符),偶数位置填满了再填奇数位置。代码classSolution{publicStringreorganize......
  • 哈希表
    哈希表1.哈希表基本介绍散列表(HashTable,也叫哈希表),是根据关键码值(KeyValue)而直接进行访问的数据结构。也即是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表的内存布局(数组+链表)2.......
  • 算法学习day07哈希表part02-454、383、15、18
    packageLeetCode.hashpart02;importjava.util.HashMap;importjava.util.Map;/***454.四数相加II*给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:*0<=i,j,k,l<n*nums1[i]+nums2[j]+nums......
  • Python中的哈希表
    哈希表是一种常用的数据结构,广泛应用于字典、散列表等场合。它能够在O(1)时间内进行查找、插入和删除操作,因此被广泛应用于各种算法和软件系统中。哈希表的实现基于哈希函数,将给定的输入映射到一个固定大小的表格中,每个表项存储一个关键字/值对。哈希函数是一个将任意长度的输入映......
  • 如何实现一个工业级哈希表
    1、散列表碰撞攻击 在极端情况下,攻击者通过精心构造的数据,使得所有的数据都散列到同一个槽里,如果使用链表冲突解决方法,散列表就会退化为链表,查询时间复杂度就从O(1)退化为O(n)。可能因为查询操作消耗大量CPU或者线程资源,导致系统无法响应其他请求,从而达到拒绝服务攻击(DoS......
  • redis之哈希类型-列表类型-集合类型-有序集合-慢查询-pipeline-发布订阅-Bitmap位图-H
    目录redis之哈希类型-列表类型-集合类型-有序集合-慢查询-pipeline-发布订阅-Bitmap位图-HyperLogLog-GEO地理位置昨日内容回顾今日内容详细1哈希类型2列表类型3集合类型4有序集合5慢查询6pipeline与事务7发布订阅8Bitmap位图9HyperLogLog10GEO地理位置redis之哈希类型......
  • 哈希类型 列表类型 集合类型 有序集合 慢查询 pipeline与事务 发布订阅 Bitmap位图 Hy
    昨日回顾#1redis介绍 -特性#速度快:10wops(每秒10w读写),数据存在内存中,c语言实现,单线程模型#持久化:rdb和aof#多种数据结构:5大数据结构BitMaps位图:布隆过滤器本质是字符串HyperLogLog:超小内存唯一值计数,12kbHyperLogLog本质是......
  • redis 哈希,集合,有序集合,持久化方案,主从复制,高可用,集群搭建扩容缩容
    目录哈希类型操作方法列表类型集合类型操作有序集合操作慢查询pipeline与事物发布订阅Bitmap位图HyperLogLogGEO地理位置信息持久化方案1.1RDB1.2aof方案1.3混合持久化主从复制原理和方案主从复制步骤哨兵高可用高可用搭建步骤集群原理及搭建集群搭建集群扩容集群缩容哈希类......