码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-10-16 17:35:19      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:text   back   else   顺序   problem   end   ram   scan   -o   

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 }
View Code

 

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

标签:text   back   else   顺序   problem   end   ram   scan   -o   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!