数据结构PTA 基础实验5-2.1 整型关键字的平方探测法散列
2020-07-17 19:03
295 查看
基础实验5-2.1 整型关键字的平方探测法散列
题目
本题的任务很简单:将给定的无重复正整数序列插入一个散列表,输出每个输入的数字在表中的位置。所用的散列函数是 H(key)=key%TSize,其中 TSize 是散列表的表长。要求用平方探测法(只增不减,即H(Key)+i2)解决冲突。
注意散列表的表长最好是个素数。如果输入给定的表长不是素数,你必须将表长重新定义为大于给定表长的最小素数。
输入格式:
首先第一行给出两个正整数 MSize(≤104)和 N(≤MSize),分别对应输入的表长和输入数字的个数。随后第二行给出 N 个不重复的正整数,数字间以空格分隔。
输出格式:
在一行中按照输入的顺序给出每个数字在散列表中的位置(下标从 0 开始)。如果某个数字无法插入,就在其位置上输出 -。输出间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
4 4
10 6 4 15
输出样例:
0 1 4 -
解法
思路
解决此题的关键要点在于:
- 需要写一个素数判定以及素数计算函数NextPrimeNumber
- 写出哈希表的构建函数、平方探测查找函数、插入函数。在插入函数中可以直接输出角标
- 如何判断一个数是不是没有地方给它插入。这是平方探测法的一个局限性,它很容易产生“即使哈希表有空位,它始终不能到达那个空位,只能在固定的几个被占用的位置反复跳跃”。解决这个问题的方法就是给i一个限制,对于本题而言,一旦i超过MAXCOUNT = 10000(可以更大),再往后找就没有意义了,那么就可以直接退出,此时用NOWHERE标记。
实现
#include<stdio.h> #include<stdlib.h> #include<math.h> #define MAXCOUNT 10000 #define NOWHERE -2 typedef enum{legitimate, empty, deleted} EntryType; typedef int EleType; typedef struct HashEntry Cell; struct HashEntry { EleType Data; EntryType Info; }; typedef struct TblNode *HashTable; struct TblNode { int TableSize; Cell *Cells; }; int NextPrimeNumber(int TableSize) { int i; int flag; if(TableSize == 1) TableSize++; while(1) { flag = 1; for(i=sqrt(TableSize); i>1; i--) { if(!(TableSize%i)) { flag = 0; break; } } if(flag == 1) break; else TableSize++; } return TableSize; } HashTable CreateTable(int TableSize) { HashTable H = (HashTable)malloc(sizeof(struct TblNode)); H->TableSize = NextPrimeNumber(TableSize); H->Cells = (Cell*)malloc(H->TableSize*sizeof(struct HashEntry)); for(int i=0; i<H->TableSize; i++) { H->Cells[i].Info = empty; } return H; } int SqFind(HashTable H, EleType key) { int CurPos, NewPos; CurPos = NewPos = key % H->TableSize; int count = 0; while(H->Cells[NewPos].Info != empty && H->Cells[NewPos].Data != key) { count++; if(count<MAXCOUNT) NewPos = CurPos + count*count; else { NewPos = NOWHERE; break; } if(NewPos>=H->TableSize) NewPos = NewPos % H->TableSize; } return NewPos; } void InsertAndOutput(HashTable H, EleType key) { int Pos = SqFind(H, key); if(Pos == NOWHERE) { printf("-"); } else if(H->Cells[Pos].Info != legitimate) { H->Cells[Pos].Data = key; H->Cells[Pos].Info = legitimate; printf("%d", Pos); } } int main() { int M,N; scanf("%d %d", &M, &N); HashTable H = CreateTable(M); EleType key; for(int i=0; i<N; i++) { scanf("%d", &key); if(i==N-1) InsertAndOutput(H, key); else { InsertAndOutput(H, key); printf(" "); } } return 0; }
相关文章推荐
- 数据结构PTA 基础实验6-2.1 列出连通集
- 详细图解什么叫平方探查法即二次探测再散列和线性探测再散列(数据结构 哈希函数 哈希冲突)
- 数据结构PTA 基础实验5-2.2 电话聊天狂人
- 4C的练习5-39 整型关键字的散列映射 <线性探测法>
- PTA 数据结构与算法分析 7-42 整型关键字的散列映射 (25 分)
- 数据结构PTA 基础实验5-2.3 QQ帐户的申请与登陆
- PTA 7-1 整型关键字的散列映射 (20 分)
- PTA-数据结构 5-42 整型关键字的散列映射 (25分)
- 数据结构--解决散列冲突,平方探测法
- 数据结构PTA 基础实验6-2.2 汉密尔顿回路
- PTA 字符串关键字的散列映射(25 分)
- 基础实验6-2.6 最短工期 (25分)(C语言实现)(数据结构)
- PTA 7-17(查找) 字符串关键字的散列映射(25 分) 25分代码
- SDUT 3377 数据结构实验之查找五:平方之哈希表(平方探测处理冲突)
- 数据结构:散列2(探测法)
- 5-42 整型关键字的散列映射 (25分)
- 数据结构PTA 进阶实验5-3.1 航空公司VIP客户查询
- 散列的平方探测法实现
- SDUT3377数据结构实验之查找五:平方之哈希表
- 数据结构PTA 进阶实验5-3.2 新浪微博热门话题