《数据结构学习与实验指导》5-2:字符串关键字的散列映射
2017-07-23 11:32
651 查看
实验内容:给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位;再用除留余数法将整数映射到长度为P的散列表中。例如将字符串“AZDEG”插入长度为1009的散列表中,首先将26个大写英文字母顺序映射到整数0~25;再通过移位将其映射为3×322+4×32+6=3206;然后根据表长得到3206%1009=179,即是该字符串的散列映射位置。发生冲突时请用平方探测法解决。
输入格式:
输入第一行首先给出两个正整数N(N≤500)和P(≥2N的最小素数),分别为待插入的关键字总数以及散列表的长度。第二行给出N个字符串关键字,每个长度不超过8位,其间以空格分隔。
输出格式:
在一行内输出每个字符串关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。
测试用例:
输入格式:
输入第一行首先给出两个正整数N(N≤500)和P(≥2N的最小素数),分别为待插入的关键字总数以及散列表的长度。第二行给出N个字符串关键字,每个长度不超过8位,其间以空格分隔。
输出格式:
在一行内输出每个字符串关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。
测试用例:
输入 | 输出 |
---|---|
4 11 HELLO ANNK ZOE LOLI | 3 10 4 0 |
6 11 LLO ANNA NNK ZOJ INNK AAA | 3 0 10 9 6 1 |
5 11 HELLO ANNA NNK ZOJ NNK | 3 0 10 9 10 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxString 8 typedef struct Node { char value[MaxString + 1]; int choosed; } *PNode; typedef struct HashTable { PNode arr; int size; } *PHashTable; int N, P; int first = 1; int char2int(char c); int str2key(char cc[]); int hash(char cc[]); PHashTable init(); int insert(PHashTable table, char cc[]); int main() { scanf("%d %d", &N, &P); PHashTable table = init(); char str[MaxString + 1]; int i; for (i = 0; i < N; i++) { scanf("%s", str); int index = insert(table, str); if (first) { printf("%d", index); first = 0; } else { printf(" %d", index); } } return 0; } PHashTable init() { PHashTable table = (PHashTable) malloc(sizeof(struct HashTable)); table->size = P; table->arr = (PNode) malloc(sizeof(struct Node) * P); int i; for (i = 0; i < P; i++) { table->arr[i].choosed = 0; } return table; } int insert(PHashTable table, char cc[]) { int index = hash(cc); int i = index; int count = 1; while (table->arr[i].choosed && strcmp(cc, table->arr[i].value) != 0) { if (count % 2 != 0) { i = (count + 1) / 2; i = i * i; } else { i = count / 2; i = -i * i; } i = i + index + table->size; i %= table->size; count++; } if (! table->arr[i].choosed) { table->arr[i].choosed = 1; strcpy(table->arr[i].value, cc); } return i; } int char2int(char c) { return c - 'A'; } int str2key(char cc[]) { int len = strlen(cc); int i = len - 1; int key = char2int(cc[i]); i--; if (i >= 0) { key += char2int(cc[i]) << 5; } i--; if (i >= 0) { key += char2int(cc[i]) << 10; } return key; } int hash(char cc[]) { int key = str2key(cc); return key % P; }
相关文章推荐
- PTA 7-17 字符串关键字的散列映射
- 5-43 字符串关键字的散列映射
- 字符串关键字的散列映射
- PTA 字符串关键字的散列映射
- 5-43 字符串关键字的散列映射 (25分)
- PTA 7-17(查找) 字符串关键字的散列映射(25 分) 25分代码
- 《数据结构学习与实验指导》5-1:整数关键字的散列映射
- PTA 字符串关键字的散列映射(25 分)
- 4C的练习5-39 整型关键字的散列映射 <线性探测法>
- 5-42 整型关键字的散列映射 (25分)
- 5-42 整型关键字的散列映射
- PTA-数据结构 5-42 整型关键字的散列映射 (25分)
- 遭遇ora-14400:插入的分区关键字未映射到任何分区。
- mybaits映射对象date类型直接返回格式化的字符串
- oracle: 分割字符串,或者查找字段里面的关键字(关键字1,关键字2,关键字3)
- POJ 3753 根据关键字进行字符串拷贝(水题)
- Codeforces Round #166 (Div. 2)D. Good Substrings(字符串散列)
- 数据表/字段名称和数据库关键字冲突在Hibernate映射中的处理办法
- .net core mysql entity映射时字符串被截断
- J2SE基础夯实系列之String字符串不可变的理解,不可变类,final关键字到底修饰了什么