哈希表之词频统计
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键值处开始,遍历所有链表,并输出各非空节点;
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法