急!!关于数据结构算法的问题!!

来源:百度知道 编辑:UC知道 时间:2024/09/21 03:23:11
题目:要求统计一组数字中每个数字的出现次数。(每个数字的大小不定,但数量很大,百万级的)
我的做法:利用二叉排序树算法一边读取数字进行比较插入建树,比根小为左孩子,大为右孩子,相等的个数加1.
问题:我师傅说这种算法速度不够快,让我用别的方法,请各位高手指点!我只要速度快的算法~~完成作业。最好能有示例代码。
用散列能行么?
给个散列的算法吧!我新手,请详细点 谢谢!!!

直接O(n)扫描一遍不就行了,百万级的数组不大啊,C的话全局变量就可以开这么大。
如果再大的话就要构造哈希函数了,也就是散列。

这道题完全用不到散列。
散列构造函数常用方法除以一个素数(这里不做证明),将结果相同的链如同一链表。注意冲突处理:对于结果相同但是数字不同的数,进行冲突处理,常用做法是链到下一个表头节点。数据结构书上有讲过,方法很多。
当然如果你取的是大于数字范围的素数,与数组就没有区别了。

LZ好,n
2的n次方 5462希望对你有帮助!

是不是也应该考虑数据的分布情况
如果出现的数值不多,我认为用二叉排序树其实不错

把数字转化为字符串,num[MAX],MAX可以自己定义一个足够大的就行,如果哦数字最大为1000,MAX=6就可以。
检查字符num[i],通过num[i]-'0'将其转化为数字,得到一个数字每位的大小,其他就不用我说了吧。
有问题可以再互相探讨。下面是我做的一个计算数字出现次数的小程序,功能就是找出0到一个任意数字出现某个数字的个数
----------------------
求0-num中含有数字NC的个数,NC!=0

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#define NC 1

main() {
int nl,i,t;
long result=0;
char num[64];
printf("Enter your number:");
scanf("%s",num);
i=nl=strlen(num);

while (i--) {
t=num[~-nl-i]-'0';
if(t>NC)
result+=pow(10,i)+t*pow(10,~-