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

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

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题目分析:这是也是一道散列表的基础题

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<malloc.h>
  5 #include<math.h>
  6 #define MAXTABLESIZE 100000
  7
  8 typedef enum{Legitimate,Empty,Deleted}EntryType;
  9 typedef struct HashEntry Cell;
 10 struct HashEntry
 11 {
 12     EntryType Type;
 13     char Data[9];
 14 };
 15 typedef struct HblNode* HashTable;
 16 struct HblNode
 17 {
 18     int TableSize;
 19     Cell* Cells;
 20 };
 21
 22 int NextPrime(int N)
 23 {
 24     int P = (N % 2)?N:N + 1;
 25     for (; P < MAXTABLESIZE; P += 2)
 26     {
 27         int i = (int)sqrt(P);
 28         for (; i > 2; i--)
 29             if (P % i == 0)
 30                 break;
 31         if (i == 2)
 32             break;
 33     }
 34     return P;
 35 }
 36
 37 HashTable CreateHashTable(int N)
 38 {
 39     int TableSize = NextPrime(N);
 40     HashTable H = (HashTable)malloc(sizeof(struct HblNode));
 41     H->TableSize = TableSize;
 42     H->Cells = (Cell*)malloc(H->TableSize * sizeof(Cell));
 43     for (int i = 0; i < H->TableSize; i++)
 44     {
 45         H->Cells[i].Type = Empty;
 46         H->Cells[i].Data[0] = ‘\0‘;
 47     }
 48     return H;
 49 }
 50
 51 int Hash(char Data[], int TableSize)
 52 {
 53     int L = strlen(Data);
 54     int sum = 0;
 55     if (L >= 3)
 56     {
 57         L--;
 58         for (int i = L - 2; i <= L; i++)
 59             sum = sum * 32 + Data[i] - ‘A‘;
 60     }
 61     else
 62     {
 63         for (int i = 0; i < L; i++)
 64             sum = sum * 32 + Data[i] - ‘A‘;
 65     }
 66     return sum%TableSize;
 67 }
 68
 69 int Find(char Data[], HashTable H)
 70 {
 71     int NewPos, CurrentPos;
 72     NewPos = CurrentPos = Hash(Data, H->TableSize);;
 73     int CNum = 0;
 74     while (H->Cells[NewPos].Type!=Empty&&strcmp(H->Cells[NewPos].Data,Data))
 75     {
 76         if (++CNum % 2)
 77         {
 78             NewPos = CurrentPos + ((CNum + 1) / 2)*((CNum + 1) / 2);
 79             while (NewPos >= H->TableSize)
 80                 NewPos -= H->TableSize;
 81         }
 82         else
 83         {
 84             NewPos = CurrentPos - (CNum / 2) * (CNum / 2);
 85             while (NewPos < 0)
 86                 NewPos += H->TableSize;
 87         }
 88     }
 89     return NewPos;
 90 }
 91
 92 void Insert(char Data[], HashTable H)
 93 {
 94     int Pos = Find(Data, H);
 95     if (H->Cells[Pos].Type != Legitimate)
 96     {
 97         H->Cells[Pos].Type = Legitimate;
 98         strcpy(H->Cells[Pos].Data, Data);
 99     }
100 }
101
102 int main()
103 {
104     int N, P;
105     scanf("%d%d", &N, &P);
106     HashTable H = CreateHashTable(P);
107     char Data[9] = { 0 };
108     for (int i = 0; i < N - 1; i++)
109     {
110         scanf("%s", Data);
111         Insert(Data, H);
112         printf("%d ", Find(Data, H));
113     }
114     scanf("%s", Data);
115     Insert(Data, H);
116     printf("%d", Find(Data, H));
117     return 0;
118 }

原文地址:https://www.cnblogs.com/57one/p/11686833.html

时间: 2024-10-06 09:32:52

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

PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)

PTA数据结构与算法题目集(中文)  7-36 社交网络图中结点的“重要性”计算 (30 分) 7-36 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱.而结点根据其所处的位置不同,其在网络中体现的重要性也不尽相同. “紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的结点能够

PTA数据结构与算法题目集(中文) 7-14

PTA数据结构与算法题目集(中文)  7-14 7-14 电话聊天狂人 (25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔.如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数. 输入样例: 4 130057

PTA数据结构与算法题目集(中文) 7-16

PTA数据结构与算法题目集(中文)  7-16 7-16 一元多项式求导 (20 分) 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格. 输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0题目分析:要注意判断输入停止的标志 利用~scanf来判断 其它问题到没发现 (

PTA数据结构与算法题目集(中文) 7-27

PTA数据结构与算法题目集(中文)  7-27 7-27 家谱处理 (30 分) 人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究.实验中,使用计算机处理家谱.为了实现这个目的,研究人员将家谱转换为文本文件.下面为家谱文本文件的实例: John Robert Frank Andrew Nancy David 家谱文本文件中,每一行包含一个人的名字.第一行中的名字是这个家族最早的祖先.家谱仅包含最早祖先的后代,而他们的丈夫或妻子不出现在家谱中.每个人的子女比父母多缩进2个空格.

PTA数据结构与算法题目集(中文) 7-32

PTA数据结构与算法题目集(中文)  7-32 7-32 哥尼斯堡的“七桥问题” (25 分) 哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示. 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学. 这个问题如今可以描述为判断欧拉回路是否存在的问题.欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个无向图,问是否存在欧拉回路? 输

PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)

PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队. 输入格式: 输入第一行给出4个正整数N.M.S.D,其中N(2)是城市的个数,顺便假设城市的编号为0 ~ (:M是快速道路的条数

PTA 数据结构与算法题目集 6-1

单链表的反转 回顾题目戳这里 https://pintia.cn/problem-sets/15/problems/724 带头节点的反转代码 List Reverse( List L ){ List head = (List)malloc(sizeof(PtrToNode)); head->Next = NULL; List cur = L,nNode; while(cur){ nNode = cur->Next; cur->Next = head->Next; head->

[PTA] 数据结构与算法题目集 6-1 单链表逆转

List Reverse(List L) { List p, q; p = L; q = L; L = NULL; while (p) { p = p->Next; q->Next = L; L = q; q = p; } return L; } 原文地址:https://www.cnblogs.com/ruoh3kou/p/9975225.html

[PTA] 数据结构与算法题目集 6-2 顺序表操作集

//创建并返回一个空的线性表: List MakeEmpty() { List L; L = (List)malloc(sizeof(struct LNode)); L->Last = -1; //因为插入一个时,Last++,此时需为-1 return L; } //返回线性表中X的位置.若找不到则返回ERROR: Position Find(List L, ElementType X) { for (int i = 0; i <= L->Last; i++) { if (L->