已知关键字序列为{PAL,LAP,PAM,MAP,PAT,PET,SET,SAT,TAT,BAT},试为它们设计一个散列函数,将其映射到区间[0……n-1]上,要求碰撞尽可能少。这里n=11,13,17,19。C语言
时间: 2023-09-15 20:18:42 浏览: 129
为了尽可能减少碰撞,我们可以使用哈希表中的链表法来解决。具体来说,对于哈希表中的每个槽,我们维护一个链表,每个链表节点存储一个关键字。
我们可以使用字符串的ASCII码值之和来计算哈希值,然后使用取模运算将其映射到区间[0……n-1]上。具体来说,我们可以将每个字符串的ASCII码值相加,然后对n取模来得到哈希值。
以下是使用链表法实现的 C 语言代码:
```C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 10
struct ListNode {
char *key;
struct ListNode *next;
};
struct HashTable {
int size;
struct ListNode **list;
};
int hash(char *key, int size) {
int sum = 0;
for (int i = 0; i < strlen(key); i++) {
sum += key[i];
}
return sum % size;
}
void insert(struct HashTable *table, char *key) {
int index = hash(key, table->size);
struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->key = key;
node->next = table->list[index];
table->list[index] = node;
}
void printHashTable(struct HashTable *table) {
for (int i = 0; i < table->size; i++) {
printf("%d:", i);
struct ListNode *node = table->list[i];
while (node != NULL) {
printf(" %s", node->key);
node = node->next;
}
printf("\n");
}
}
int main() {
char *keys[] = {"PAL", "LAP", "PAM", "MAP", "PAT", "PET", "SET", "SAT", "TAT", "BAT"};
int n[] = {11, 13, 17, 19};
int size = sizeof(n) / sizeof(n[0]);
for (int i = 0; i < size; i++) {
printf("n = %d:\n", n[i]);
struct HashTable table;
table.size = n[i];
table.list = (struct ListNode**)malloc(sizeof(struct ListNode*) * table.size);
memset(table.list, 0, sizeof(struct ListNode*) * table.size);
for (int j = 0; j < sizeof(keys) / sizeof(keys[0]); j++) {
insert(&table, keys[j]);
}
printHashTable(&table);
printf("\n");
free(table.list);
}
return 0;
}
```
在这个代码中,`hash` 函数计算字符串的哈希值,`insert` 函数将关键字插入哈希表中,`printHashTable` 函数打印哈希表中的内容。在 `main` 函数中,我们依次使用不同的 n 值构建哈希表,并输出哈希表的内容。
阅读全文