算法,请问如何获取n个数中重复最多的那个数?100(100分)

  • 主题发起人 主题发起人 zyf23
  • 开始时间 开始时间
Z

zyf23

Unregistered / Unconfirmed
GUEST, unregistred user!
算法,请问如何获取n个数中重复最多的那个数?
例:10个数,
5,6,5,2,5,8,9,14,78,105编程如何实现找到5是最多的重复数?
 
先取出一个数,计数器=1,然后从第2个开始找起,找到则计数器+1,并且把
这个数从这个数组中删除,直到最后,你会得到一个没有第一个数的新数组,然后
把计数器的值加到计数器数组中。然后再从新的数组中重复从第一步开始.
然后你就可以从计数器数组中得到最大的值了。
 
先来个笨办法:把这些数据放到一表中(table)然后,包括字段fld字符串的
select fld,count(*) from table group by fld

 
应该先排序,然后再寻找,这样效率应该高很多。
 
对呀,排序了再采用什么二分查找呀,什么的算法就效率高多了。
 
用算法是吧?
你可以假設第一個數是重復最多的,用一個變量保存其重復次數,(i)
用另一個變量保存當前數的重復次數(j)
然后接下去找,只要找到重復的,j就加一,當循環完所有n個數后,比較i和j的值
當i>j 說明當前的重復次數沒有比假設的多
當i<j說明當前的重復次數是最多的,i:=j還是設置i是當前重復次數最多的
繼續查找下一個,這樣循環到最后一個數就可以結束
如果要記住是那一個數是重復,就多加一個變量保存當前重復次數最多的就行了
 
function m(k:array of integer):integer;
type
Pr=^tr;
tr=record
num:Integer;
Cou:Integer;
end;
var
l:TList;
r:pr;
i,j:integer;
H:boolean;
begin
l:=TList.Create;
for i:=0 to high(k) do
begin
h:=True;
for j:=0 to l.Count-1 do
if tr(l.Items[j]^).num = k then
begin
inc(tr(l.Items[j]^).Cou);
h:=False;
Break;
end;
if h then
begin
new(r);
r^.num :=k;
r^.Cou :=1;
l.Add(r);
end;
end;

for i:=0 to l.Count-1 do
begin
r:=l.Items;
showmessage('数字'+inttostr(r^.num)+'出现了'+inttostr(r^.Cou)+'次');
Dispose(r);
end;
l.Free;
end;
 
本来这并不是一道难题,
我只是对这里面的算法有点兴趣,

yanghai0437说的对,但是,不是最优,
wr960204说的我试了可以找到,但是有点太麻烦了,如果做成一个类的成员函数,
再去声明那么多的变量。。。。,不符合我的要求!

我的需求:
输入: 一个动态数组!
编程实现找到第一次出现重复数是最多的重复数?
输出:该重复数!
 
使用循环来控制!
 
两个循环,复杂度N的平方,再用两个数字,一个是出现次数最多的数字,一个是它出现的次数,就够了。
 
大家好,我是初学者,希望大家以后多多支持,大家对这个问题各抒已见,我也来
谈一点儿看法。
我只需定义一种指针类型:包含一个指针指向本类型、一个变量用来记录数据、一个
变量用来记录次数,次数变量初值为0。再建立一个这种类型的动态链表用来盛放这些数据
只需把这些节点访问一遍,次数变量里就是这个值的重复次数,再找次数最大的就行了
 
//過程F是顯示一個數組中第一個重復次數最多的數和次數
procedure F( A:Array of integer);
var i,j,n,c,val:integer;
begin
c:=0;
n:=1;
val:=A[low(A)];
for i:=low(A) to high(A) do
begin
for j:=i+1 to high(A) do
begin
if A=A[j] then
inc(n);
end;
if n>c then
begin
c:=n;
val:=A;
end;
n:=1;
end;
ShowMessage('出現次數最多的數是'+IntToSTr(val)+' 次數是'+IntToSTr(c));
end;

//下面是調用F(B)
procedure TForm1.Button1Click(Sender: TObject);
const B:Array[1..10] of Integer=(5,6,5,2,5,8,9,14,78,105);
begin
F(B);
end;
//可以通過傳遞其它的數組來得到結果
 
stuwe,
感谢你花费时间关注本贴,
你的算法可以,但是如果有两个或更多相同的重复数时,你返回的是第一个!

还是多谢!
 
如果想顯示多個重復次數的話
那就不用一個變量來存放,用一個數組來存放就可以
條件是:if n>=c then再分if n=c
 
后退
顶部