PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)
给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数(将关键字Key中的最后3个字符映射为整数,每个字符占5位;再用除留余数法将整数映射到长度为P的散列表中。例如将字符串AZDEG
插入长度为1009的散列表中,我们首先将26个大写英文字母顺序映射到整数0~25;再通过移位将其映射为3;然后根据表长得到,即是该字符串的散列映射位置。
发生冲突时请用平方探测法解决。
输入格式:
输入第一行首先给出两个正整数N(≤)和P(≥的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个字符串关键字,每个长度不超过8位,其间以空格分隔。
输出格式:
在一行内输出每个字符串关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。
输入样例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
题目分析:这是也是一道散列表的基础题
- #define _CRT_SECURE_NO_WARNINGS
- #include<stdio.h>
- #include<string.h>
- #include<malloc.h>
- #include<math.h>
- #define MAXTABLESIZE 100000
- typedef enum{Legitimate,Empty,Deleted}EntryType;
- typedef struct HashEntry Cell;
- struct HashEntry
- {
- EntryType Type;
- char Data[];
- };
- typedef struct HblNode* HashTable;
- struct HblNode
- {
- int TableSize;
- Cell* Cells;
- };
- int NextPrime(int N)
- {
- int P = (N % )?N:N + ;
- for (; P < MAXTABLESIZE; P += )
- {
- int i = (int)sqrt(P);
- for (; i > ; i--)
- if (P % i == )
- break;
- if (i == )
- break;
- }
- return P;
- }
- HashTable CreateHashTable(int N)
- {
- int TableSize = NextPrime(N);
- HashTable H = (HashTable)malloc(sizeof(struct HblNode));
- H->TableSize = TableSize;
- H->Cells = (Cell*)malloc(H->TableSize * sizeof(Cell));
- for (int i = ; i < H->TableSize; i++)
- {
- H->Cells[i].Type = Empty;
- H->Cells[i].Data[] = '\0';
- }
- return H;
- }
- int Hash(char Data[], int TableSize)
- {
- int L = strlen(Data);
- int sum = ;
- if (L >= )
- {
- L--;
- for (int i = L - ; i <= L; i++)
- sum = sum * + Data[i] - 'A';
- }
- else
- {
- for (int i = ; i < L; i++)
- sum = sum * + Data[i] - 'A';
- }
- return sum%TableSize;
- }
- int Find(char Data[], HashTable H)
- {
- int NewPos, CurrentPos;
- NewPos = CurrentPos = Hash(Data, H->TableSize);;
- int CNum = ;
- while (H->Cells[NewPos].Type!=Empty&&strcmp(H->Cells[NewPos].Data,Data))
- {
- if (++CNum % )
- {
- NewPos = CurrentPos + ((CNum + ) / )*((CNum + ) / );
- while (NewPos >= H->TableSize)
- NewPos -= H->TableSize;
- }
- else
- {
- NewPos = CurrentPos - (CNum / ) * (CNum / );
- while (NewPos < )
- NewPos += H->TableSize;
- }
- }
- return NewPos;
- }
- void Insert(char Data[], HashTable H)
- {
- int Pos = Find(Data, H);
- if (H->Cells[Pos].Type != Legitimate)
- {
- H->Cells[Pos].Type = Legitimate;
- strcpy(H->Cells[Pos].Data, Data);
- }
- }
- int main()
- {
- int N, P;
- scanf("%d%d", &N, &P);
- HashTable H = CreateHashTable(P);
- char Data[] = { };
- for (int i = ; i < N - ; i++)
- {
- scanf("%s", Data);
- Insert(Data, H);
- printf("%d ", Find(Data, H));
- }
- scanf("%s", Data);
- Insert(Data, H);
- printf("%d", Find(Data, H));
- return ;
- }
PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)的更多相关文章
- PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分) 给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...
- PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)
PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分) 7-36 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某 ...
- PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分)
PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分) 7-41 PAT排名汇总 (25 分) 计算机程序设计能力考试(Programming Ability Test,简称P ...
- PTA数据结构与算法题目集(中文) 7-40奥运排行榜 (25 分)
PTA数据结构与算法题目集(中文) 7-40奥运排行榜 (25 分) 7-40 奥运排行榜 (25 分) 每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同.比如 ...
- PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分)
PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分) 7-39 魔法优惠券 (25 分) 在火星上有个魔法商店,提供魔法优惠券.每个优惠劵上印有一个整数面值K,表示若你在购买某商 ...
- PTA数据结构与算法题目集(中文) 7-38寻找大富翁 (25 分)
PTA数据结构与算法题目集(中文) 7-38寻找大富翁 (25 分) 7-38 寻找大富翁 (25 分) 胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假 ...
- PTA数据结构与算法题目集(中文) 7-37 模拟EXCEL排序 (25 分)
PTA数据结构与算法题目集(中文) 7-37 模拟EXCEL排序 (25 分) 7-37 模拟EXCEL排序 (25 分) Excel可以对一组纪录按任意指定列排序.现请编写程序实现类似功能. ...
- PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)
PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...
- PTA数据结构与算法题目集(中文) 7-34
PTA数据结构与算法题目集(中文) 7-34 7-34 任务调度的合理性 (25 分) 假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行.“ ...
随机推荐
- python基础学习day6
代码块.缓存机制.深浅拷贝.集合 id.is.== id: 可类比为身份号,具有唯一性,若id 相同则为同一个数据. #获取数据的内存地址(随机的地址:内存临时加载,存储数据,当程序运行结束后,内存地 ...
- Graylog2进阶 打造基于Nginx日志的Web入侵检测分析系统
对于大多数互联网公司,基于日志分析的WEB入侵检测分析是不可或缺的. 那么今天我就给大家讲一讲如何用graylog的extractor来实现这一功能. 首先要找一些能够识别的带有攻击行为的关键字作为匹 ...
- 「CSS」常见的清除浮动方法
下面介绍几种清除浮动的方案,供大家参考: 使用额外的标签clear:both .parent {padding: 10px;width: 200px;background: red;} .child ...
- vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器
最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...
- java-FileUtils(读取、判断、获取)-(新手)
实例: lx1: import org.apache.commons.io.*; import java.io.File; import java.io.IOException; public cla ...
- 读书笔记——莫提默·J.艾德勒&查尔斯·范多伦(美)《如何阅读一本书》
第一篇 阅读的层次 第一章 阅读的活力与艺术 阅读的目标:娱乐.获得资讯.增进理解力这本书是为那些想把读书的主要目的当作是增进理解能力的人而写.何谓阅读艺术?这是一个凭借着头脑运作,除了玩味读物中的一 ...
- js遍历删除对象的key
// 如果用户没有填写值,则删除对象的key. Object.keys(obj).forEach( (key) => { if (!obj[key]) { // !obj[key]表示 ...
- ajax结合sweetalert弹出框删除数据
思路:
- mysql系列--sql实现原理
count(*) MyISAM 引擎把⼀个表的总⾏数存在了磁盘上,因此执⾏ count(*) 的时候会直接返回这个数,效率很⾼:但是加了条件则不能快速返回⽽ InnoDB 引擎就麻烦了,它执⾏ cou ...
- CF 997A
You’ve got a string a1,a2,…,an, consisting of zeros and ones.Let’s call a sequence of consecutive el ...