标签:
此题为小白书暴力求解法哈希表的训练参考
题目链接 http://acm.hust.edu.cn/vjudge/problem/24031
最近为了快速入门。。。所以挑了些简单的题目先做。。。
解题思路
最多会录入100000个单词对。可以设计一个简单的哈希函数,比如下标*单词这样的,
当然这样会造成较多冲突,如果是极限数据的话装填因子a达到了100。。。
如果用拉链法解决冲突的话,平均查找长度其查找成功大概是50左右,速度上还是可以凑合的。
填装因子a = 填入表中记录的个数 / 散列表的长度
拉链法的平均查找长度
查找成功是为1+a/2 查找失败是为a+e^-a (e为自然对数)
代码
#include<stdio.h> #include<string.h> #define MAX_LEN 26*55+10 typedef struct node { char word[11]; char eng[11]; struct node *next; }Node; Node H[MAX_LEN]; int f(char *s) { int tot = 0; for(int i=0; i<strlen(s); i++) { tot += (s[i]-‘a‘)*(i+1); } return tot; } void hash(int index, char *eng, char *word) { Node *p = &H[index]; Node *u = new Node; strcpy(u->word, word); strcpy(u->eng, eng); u->next = p->next; p->next = u; } void ReadLine() { char eng[11], word[11]; scanf("%s%s", eng, word); int index = f(word); hash(index, eng, word); } void Print(int dex, char *w) { Node *p = &H[dex]; p = p->next; while(p!=NULL) { if(strcmp(p->word, w)==0) { printf("%s\n", p->eng); return ; } p = p->next; } printf("eh\n"); } int main() { char ch, wordw[11]; while(true) { ReadLine(); getchar(); ch = getchar(); if(ch == ‘\n‘) break; else ungetc(ch, stdin); } while(scanf("%s", wordw)==1) { int dex = f(wordw); Print(dex, wordw); } return 0; }
标签:
原文地址:http://www.cnblogs.com/ZengWangli/p/5769021.html