数据结构与算法题目集(中文) - 7-43 字符串关键字的散列映射(25 分)

简介: 数据结构与算法题目集(中文) - 7-43 字符串关键字的散列映射(25 分)

题目链接:点击打开链接

题目大意:略。

解题思路:


注意1:对于重复的数字,只输出它第一次出现的位置,而不是实际存储的位置。


注意2:每个字符串长度可能小于3。


注意3:每个字符占5位意义:类似二进制 (1位,即:2^1==2) 转十进制,一定是唯一的,而在这里是5位,即:2^5==32,所以转十进制就和其他进制转十进制是一样的,而且肯定唯一。


移位法:

将分割后的每部分低位对齐相加。


除留余数法:

设散列表中允许的地址数为m,取一个不大于m,但接近或者等于 m 的质数 p 作为除数,按照哈希函数:Hash(key) = key % p p<=m,将关键码转换成哈希地址。


平方探测法(即二次探测法):

添加元素时,使用散列函数确定元素的插入位置,如果此空间有值:依次查看其后的下一个(这里的下一个不是物理位置的下一个)桶,如果发现空位置插入新元素,如果到达最后一个时,也没适合位置,从头开始找;如果一直没找到,那么插入失败。即 Hash(key) = (key + or - i^2) % p,(i=0,1,2,3,...)(0<= i <= p-1)(先 + 后 - )。


AC 代码


/

#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
unordered_map<string,int> ump;
int main()
{
    int n,p;
    char s[20];
    while(~scanf("%d%d",&n,&p))
    {
        int a[p], vis[p];
        mem(a,-1); mem(vis,-1);
        ump.clear();
        int len,idx,sum,f=1;
        for(int i=0;i<n;i++)
        {
            scanf("%s",s);
            len=strlen(s);
            if(ump[s]!=0)
            {
                printf(" %d",a[ump[s]==-1?0:ump[s]]);
                continue;
            }
            if(len==1)
                sum=s[len-1]-'A';
            else if(len==2)
                sum=s[len-1]-'A' + (s[len-2]-'A')*32;
            else
                sum=s[len-1]-'A' + (s[len-2]-'A')*32 + (s[len-3]-'A')*32*32;
            for(int j=0;;j++)
            {
                idx=(sum+j*j)%p;
                if(vis[idx]==-1)
                {
                    a[i]=idx;
                    vis[idx]=1;
                    ump[s]=i==0?-1:i;
                    break;
                }
                idx=(sum-j*j+j*j*p)%p;
                if(vis[idx]==-1)
                {
                    a[i]=idx;
                    vis[idx]=1;
                    ump[s]=i==0?-1:i;
                    break;
                }
            }
            if(f){ f=0; printf("%d",a[i]); }
            else printf(" %d",a[i]);
        }
        puts("");
    }
    return 0;
}
目录
相关文章
|
4月前
|
存储 缓存 NoSQL
redis数据结构-字符串
redis数据结构-字符串
42 1
|
4月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
1月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
48 6
|
2月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
97 1
两个字符串匹配出最长公共子序列算法
|
2月前
|
存储 C语言
栈和队列题目练习
栈和队列题目练习
20 0
|
4月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
57 6
|
5月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
309 1
|
4月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
90 0
下一篇
DataWorks