一串数找出出现频率最多数的算法问题(70分)

  • 主题发起人 主题发起人 哦哦哦哦哦
  • 开始时间 开始时间

哦哦哦哦哦

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一堆数,付给了一个数组x[0..y](y是这些数的数量),我想知道这个数组里出现频率最多的那个数,有什么好算法吗?
 
在生成2个数组a[0..y] b[0..y]
a[0]:=x[0];
a[0]于x[0..y]比较,相同的x:=-1;
b[0]:=个数;
2
a[1]:=第二个不为-1;
a[1]:于x[0..y]比较,相同的x:=-1;
b[1]:=个数;
 
建立一个数组a[0..y],定义变量num,i,j,并初始化为0;
对x中每个值:
令其等于num;
如果在数组a中找到,则转x的下一个值;
如果未找到,则将其插入到a的末尾,并将j加1;
从x的该位置往后遍历数组,每找到一个相同的值,则将j加1;
如果j>i,则i=j,j=0;
最后得到的num即为频率最多的数,i为出现的次数
 
用哈希做效率高,首先最好知道你的数所在的范围,例如你的数在50~1000之间,则在设一数组
a[50..1000],初始化为0,设一表示记录最大个数的变量max,初值0,一次遍历数组,若x(i)=k;则a[k]++,若a[k]>max.则更新max,就可以得到频率最多的数的个数.
这是最简单的哈希表,空间换时间,复杂度O(y),我一个词频统计的问题,也是要做一个哈希,各位可以看看
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2539819
 
for i:=0 to y-1do
//循环
begin
for c:=i+1 to ydo
begin
//循环
if x=x[c] then
//判断出现次数最多的值
begin
a:=a+1;
end;
if temp<a then
begin
temp:=a;
temp1:=i;
end;
end;
end;

a就是出现频率最多数的次数,x是出现频率最多数
这个算法是最简单的,但效率不理想,还可以改进的
 
先排序,之后简单统计一下
 
是不是可以通过这样来实现啊?将数组的第一个数与余下的一一比较,遇到相等的COUNT加1,依次的一一比较,在比较的过程中只需设置两个计数器COUNT1;当第二个数比较完了的时候将第二个数的计数器与第一个数的计数器比较,将小的一个计数器空间释放用来存放第三个数比较的计数个数,依次比较。这是我第一次回答问题。我刚来坛子喔!请大家多多关照啊!因为我是一个大菜鸟。
 
多人接受答案了。
 
后退
顶部