哈希算法--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

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义