哈希表之词频统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
 
 
typedef struct node_t{
    struct node_t *next;
    char *word;
    int count;
}*node;
 
#define NHASH 9973 // 最好定位质数
#define MULT 31     // 乘法器
node bin[NHASH];    // 哈希表索引
 
unsigned int hash(char *p)
{
    unsigned int h = 0;
    for(; *p; p++)
        h = MULT * h + *p;
    return h % NHASH;
}
 
void incword(char *s)
{
    unsigned int h = hash(s);
    node p;
    for(p=bin[h]; p; p=p->next)
        if(strcmp(s, p->word) == 0){
            (p->count)++;
            return;
        }
    p = malloc(sizeof(*p));
    p->count = 1;
    p->word = malloc(strlen(s)+1);
    strcpy(p->word, s);
    p->next = bin[h]; // 栈式插入,从表头处插入,而非从表的尾部插入
    bin[h] = p;
}
 
 
void main(int argc, char **argv)
{
    int i;
    char buf[32];
    for(i=0; i<NHASH; i++)
        bin[i] = NULL;
    int ii = 0, cc;
    while(1){
        scanf("%s",buf);
        printf("--- %d\n", ii++);
        if(*buf == 'q')
            break;
        incword(buf);
    }
 
    node p;
    for(i=0; i<NHASH; i++)
        for(p = bin[i]; p; p = p->next)
            printf("%s:%d\n", p->word, p->count);
}

 

以哈希表为数据结构统计词频大致思路:

构造一个结构体数组 struct node_t bin[质数]; 称为哈希表

构造一个哈希函数,给定一个 字符串 返回一个整数,这个整数哈希表的键值;

每获取一个字符串,把字符串 与 它的所对应键值的node 节点为表头的链表上的所有单词比较,若存在相同的,count++,否则增加到链表节点,把单词挂到该节点上,并置count=1;

输出的时候,从哈希表的0键值处开始,遍历所有链表,并输出各非空节点;

 

posted @   庄庄庄  阅读(3452)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
点击右上角即可分享
微信分享提示