哈希算法--7-14 字符串关键字的散列映射 (25 分)

2024-03-05 09:18

本文主要是介绍哈希算法--7-14 字符串关键字的散列映射 (25 分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

除留余数法设计哈希表 :

由该式子得到value在哈希表中的存储位置:index = value % p;这里为了尽量的减少冲突,而且让value在哈希表中尽可能的均匀分布,p的选择就至关重要了。而合理选择p的经验是:若散列表表长为m,通常p为小于或等于表长(最好接近m)的最小质数或不包含小于20质因子的合数。

平方探测法:

冲突是不可避免的,本题中提到的解决冲突的平方探测法:

  1. 当index的位置已经没有被占用,则index就是hash值。如果已经别占用,则进行步骤2.
  2. 看ans = index+k*k(k从1开始)是不是被占用,如果没有被占用,则ans为hash值,否则就进行步骤3.
  3. 看ans = index-k*k(k从1开始)是不是别占用,如果没有被占用,则ans为hash值,否则就k++,进行步骤2.

代码:

#include <iostream>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <map>
#define INF 0x3f3f3f3f
#define FRE() freopen("in.txt","r",stdin)using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int maxn = 50010;
map<string,int> mp;
string str;
int vis[maxn];int Judge(int sum, int p){sum %= p;if(mp.count(str)){//重复出现return sum;}if(vis[sum] && mp[str] == 0){//发生冲突int k = 1,tmp = sum;while(vis[sum]){sum = (tmp+k*k)%p;if(!vis[sum])break;sum = (tmp-k*k+p)%p;k++;}vis[sum] = 1;mp[str] = sum;return sum;}else if(!vis[sum] && mp[str] == 0){vis[sum] = 1;mp[str] = sum;return sum;}
}int main() {//FRE();int n,p;cin>>n>>p;memset(vis,0,sizeof(vis));for(int i = 0; i<n; i++) {cin>>str;int len = str.size(),sum = 0;if(len>3) {for(int j = len-3; str[j]; j++) {int temp = str[j]-'A';sum = sum*32 + temp;}} else {for(int j = 0; str[j]; j++) {int temp = str[j] - 'A';sum = sum*32 + temp;}}int tt = Judge(sum, p);if(i == 0)cout<<tt;elsecout<<" "<<tt;}cout<<endl;return 0;
}
/*
输入1:
4 11
HELLO ANNK ZOE LOLI
输出1:
3 10 4 0
输入2:
6 11
LLO ANNA NNK ZOJ INNK AAA
输出2:
3 0 10 9 6 1
*/

 

 

这篇关于哈希算法--7-14 字符串关键字的散列映射 (25 分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/776008

相关文章

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Java 关键字transient与注解@Transient的区别用途解析

《Java关键字transient与注解@Transient的区别用途解析》在Java中,transient是一个关键字,用于声明一个字段不会被序列化,这篇文章给大家介绍了Java关键字transi... 在Java中,transient 是一个关键字,用于声明一个字段不会被序列化。当一个对象被序列化时,被

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float