【数据结构】用Hash方法统计数字出现次数
来源:互联网 发布:手机自动截图软件 编辑:程序博客网 时间:2024/05/20 18:18
题源:北航6系数据结构作业
【问题描述】
用HASH方法统计整数出现的次数
【输入形式】
以逗号分隔,#结尾的整数
【输出形式】
等式。左侧为排序好的整数,右侧为其出现的次数。
【样例输入】
2, 6, 7, 13, 18, 3, 6, 1, 3, 7#
【样例输出】
1=1
2=1
3=2
6=2
7=2
13=1
18=1
一开始用的是比较简单的Hash函数 hash(k) = k
这样的话存在一个问题就是数组要开很大的,遇到比如{1,1kW, 1E}这样就浪费了很多空间
#include <stdio.h>int main() { int i; int d; char c; int MAX_NUM = 0; int a[1000] = {0}; while (1) { scanf("%d%c", &d, &c ); if ( d > MAX_NUM) MAX_NUM = d; a[d]++; if( c == '#') break; } for ( i = 0; i <= MAX_NUM; i++){ if( a[i] > 0 ) printf("%d=%d\n", i, a[i]); } return 0;}
用一个链表按序存储输入的数字,这样的时间复杂度是O(n),然后用了一个指针数组来存放每个数字的值和出现的次数
H(k)= k mod 10;
此处有个考虑不周到的地方是忘记释放链表的内存了
#include <stdio.h>#include <stdlib.h>typedef struct Node { int num; int time; // int mark; struct Node *link;} HNode, *HLink;typedef struct Node1 { int num; struct Node1 *link;} NumNode, *NumLink;int main() { char c = '0'; int hNum; int i; HLink bucket[10], p, q, r; NumLink head, s, t, w; for( i = 0; i < 10; i++) { //bucket[i]->link = NULL; p = (HLink)malloc(sizeof(HNode)); p->link = NULL; bucket[i] = p; //bucket[i]->mark = 0; } head = (NumLink)malloc(sizeof(NumNode)); head->link = NULL; do { scanf("%d%c", &hNum, &c); //printf("%d ", hNum); if( head->link == NULL ) { s = (NumLink)malloc(sizeof(NumNode)); s->num = hNum; s->link = NULL; head->link =s; } else { t = head->link; while( t != NULL ) { if( t->num == hNum ) { break; } t = t->link; } if( t == NULL ) { s = (NumLink)malloc(sizeof(NumNode)); s->num = hNum; s->link = NULL; t = head->link; while( t != NULL ) { if ( t->num > hNum ) break; w = t; t = t->link; } if( t == head->link ) { head->link = s; s->link = t; } else { w->link = s; s->link = t; } } } if ( bucket[hNum%10]->link == NULL ) { p = (HLink)malloc(sizeof(HNode)); p->num = hNum; p->time = 1; // p->mark = 0; p->link = NULL; bucket[hNum%10]->link = p; } else { p = bucket[hNum%10]->link; while ( p != NULL ) { if( p->num == hNum ) { p->time++; break; } r = p; p = p->link; } if ( p == NULL ) { q = (HLink)malloc(sizeof(HNode)); q->num = hNum; q->time = 1; //q->mark = 0; q->link = NULL; r ->link = q; } } //if( c == '#') // break; } while( c != '#'); t = head->link; while( t != NULL ) { //printf("%d", t->num); p = bucket[(t->num)%10]->link; while ( p != NULL ) { if ( p->num == t->num ) { printf("%d=%d\n", p->num, p->time); break; } p = p->link; } t = t->link; } return 0;}
0 0
- 【数据结构】用Hash方法统计数字出现次数
- 统计数字出现次数
- 剑指offer 32 统计数字出现次数
- 统计数字出现的次数,最大次数的统计出来
- 用switch...case语句统计数字、空格和其他字符出现的次数
- 1486. 统计数字(先排序,再遍历数组统计出现次数)
- 统计数字在排序数组中出现的次数
- 统计数字在排序数组中出现的次数
- 腾讯面试题(统计数字出现的次数问题)
- 【C语言】统计数字在排序数组中出现的次数
- 华为机试——统计数字出现次数
- C#-统计数字中每种数字出现的次数
- 统计数字在排序数组中出现的次数
- 统计数字(hash)
- 从终端输入中统计数字,空白符,其他字符出现次数
- 1-100 使用while循环来统计数字9出现出的次数
- 利用PYTHON快速统计数字|单词在文本中出现的次数
- 统计数字出现个数
- win10下安卓开发之genymotion加载失败处理记
- Java常见乱码问题总结
- 利用axis生成wsdl服务端代码
- 创建一个简单的WCF程序
- [SQL Server] 数据库日志文件自动增长导致连接超时的分析
- 【数据结构】用Hash方法统计数字出现次数
- sql遇到的问题
- Java中Properties类的使用
- ROS turtlebot初学者总结
- Swift2.0-异常处理(Exception handler)
- 如何写好论文摘要
- Qt入门(4)——Qt常见控件
- oracle 数据库job 创建
- Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:test (default-test)