如何求众数?(出现频率最高的数)

wuyaobin 2003-07-02 06:39:58
例如我有一个数组A=[33,34,33,36,33,38,33,58,33]
如何求出33这个数呢?数组比较大,要求较快的算法.
...全文
1654 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
azure711 2003-07-12
  • 打赏
  • 举报
回复
同意用散列法
ZhangYv 2003-07-12
  • 打赏
  • 举报
回复
9494...依照数据的特殊性(大小,范围等)可以设计出O(n)的算法,如果需要一个通用的算法,是需要O(nlogn).
eion 2003-07-11
  • 打赏
  • 举报
回复
我有一法:

作一个Hash表,先添Hash表,然后再分析冲突最多的数据

当然,Hash表要选择好,或者几个Hash表,再分析




ZhangYv 2003-07-11
  • 打赏
  • 举报
回复
还有就上面的 happy__888([顾问团]寻开心) 和 BlueSky2008() 的方法也可以到O(N),排序算法最快是线性排序,只有比较类的排序最快才是O(nlogn).当N上万时候,随机算法的效率要高于普通的O(n)算法.
ZhangYv 2003-07-11
  • 打赏
  • 举报
回复
还有就上面的 happy__888([顾问团]寻开心) 和 BlueSky2008() 的方法也可以到O(N),排序算法最快是线性排序,只有比较类的排序最快才是O(nlongn)
ZhangYv 2003-07-11
  • 打赏
  • 举报
回复
to aliceZOOZ(alice):
请参阅<<计算机算法设计与分析>>,王晓东 编著,7.5章节蒙特卡罗(Monte Carlo)算法主元素问题.当N非常大时候,使用随机算法是必要的.
aliceZOOZ 2003-07-11
  • 打赏
  • 举报
回复
老大,散列的复杂度与散列的大小有关,与冲突的可能也有关;
这道题目,你选择哪种排序算法是“合适的线性”的?
ZhangYv 2003-07-11
  • 打赏
  • 举报
回复
ft...反正至少有3种O(n)的方法:
1. 选择一种合适的线性排序算法
2. 用散列法
3. 随机算法
aliceZOOZ 2003-07-11
  • 打赏
  • 举报
回复
我记得基数排序算法的复杂度是O(N*B),B是字长,
B可以等于logN,如果数都不相同的话,
而且B也可能大于logN,当然也可能小于logN;
aliceZOOZ 2003-07-11
  • 打赏
  • 举报
回复
To ZhangYv(我要数学ing)
BlueSky2008() 说得好 如果数值在一定是范围内

happy__888([顾问团]寻开心) 的方法第一种要求 如果数是有范围的,而且范围比较小,
第二种方法要用平衡二叉树,而且建树复杂度也是O(nlogn)

再说,排序算法最快是线性排序,这个是有前提的,而这道题目来说并不满足;

至于王晓东的书,我没看过,不作评论
kbsoft 2003-07-11
  • 打赏
  • 举报
回复
eion好久不见:)
aliceZOOZ 2003-07-10
  • 打赏
  • 举报
回复
求众数有O(N)的算法吗?愿闻其祥
aliceZOOZ 2003-07-10
  • 打赏
  • 举报
回复
ft...这样的题目居然用随机算法,不知道是怎么想的;
而且最笨的统计居然是O(N)?排序是O(logN),还可以从O(logN)“降”到O(N)...
ZhangYv 2003-07-09
  • 打赏
  • 举报
回复
排序是可以的,但效率是O(logn)略低.如果采用用空间换时间可以到O(n),用我所说的近似算法对于N很大(>10000)还可以更快...
wuyaobin 2003-07-09
  • 打赏
  • 举报
回复
下面是我实现的具体算法:(用Pascal)

//求众数
function Most(var a: array of Integer): Integer;
//快速排序
procedure QuickSort(var a: array of Integer; iLo, iHi: Integer);
var
Lo, Hi, Mid, T: Integer;
begin
Lo:=iLo;
Hi:=iHi;
Mid:=a[(Lo+Hi)div 2];
repeat
while a[Lo]<Mid do
Inc(Lo);
while a[Hi]>Mid do
Dec(Hi);
if Lo<=Hi then begin
T:=a[Lo];
a[Lo]:=a[Hi];
a[Hi]:=T;
Inc(Lo);
Dec(Hi);
end;
until Lo>Hi;
if Hi>iLo then
QuickSort(a, iLo, Hi);
if Lo<iHi then
QuickSort(a, Lo, iHi);
end;
var
i, PreNum, PreCount, CurNum, CurCount: Integer;
begin
QuickSort(a, low(a), high(a));
PreNum:=-1;
PreCount:=-1;
CurNum:=-1;
CurCount:=-1;
for i:=low(a)to high(a) do begin
if CurNum=a[i] then begin
Inc(CurCount);
end
else begin
if CurCount>PreCount then begin
PreNum:=CurNum;
PreCount:=CurCount;
end;
CurNum:=a[i];
CurCount:=0;
Inc(CurCount);
end;
end;
if CurCount>PreCount then
Result:=CurNum
else
Result:=PreNum;
end;
//若有错误,请帮忙修改,谢谢!
ZhangYv 2003-07-06
  • 打赏
  • 举报
回复
不是的,最慢的情况下可以在O(N)完成,也就采用最土的计数方法.
ZhangYv 2003-07-05
  • 打赏
  • 举报
回复
也就是蒙特卡罗算法主要是测试+修正,求出的近似解不一定正确,但它是一种控制正确率的算法.具体算法可以到网上搜搜...
ZhangYv 2003-07-05
  • 打赏
  • 举报
回复
呵呵,这个问题是蒙特卡罗算法的典型应用...利用随机算法求近似解.
kbsoft 2003-07-05
  • 打赏
  • 举报
回复
最快可以在O(n)内完成
寻开心 2003-07-03
  • 打赏
  • 举报
回复
数的范围比较大的时候使用二叉查找树好一些。
树节点上记录的是一个数值,以及出现的次数。左右节点分别指向大于或者小于该节点所记录的数值的节点。
这样可以按照折半查找的速度快速定位,对于统计每个数出现的次数比较有帮助。
随后遍历一次树,就可以知道出现最多的数字了。
加载更多回复(6)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧