码迷,mamicode.com
首页 > 其他好文 > 详细

uva10282-字典

时间:2016-08-13 22:44:59      阅读:387      评论:0      收藏:0      [点我收藏+]

标签:

此题为小白书暴力求解法哈希表的训练参考

 

题目链接 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;
}

 

uva10282-字典

标签:

原文地址:http://www.cnblogs.com/ZengWangli/p/5769021.html

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