首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

问个delphi for循环的效率改进有关问题

2013-03-27 
问个delphi for循环的效率改进问题这样一个循环:list:Tstringlist{假设list已经创建好,有30000个元素,每

问个delphi for循环的效率改进问题
这样一个循环:

list:Tstringlist;

  假设list已经创建好,有30000个元素,每个元素都是4位数的随机数,
  并且List不能排序,可以有相同的。
}

procedure TestFor;
var
  i,j:Integer;
begin
  for i:=0 to list.count-1 do begin
    for J:=0 to list.count-1 do begin
      if i <> j then begin
        //OtherHandle;做其他处理
      end;
    end;
  end; 
end;
要求:求出list里面相同元素的个数。
从要求开看代码很简单,明显不能用List.Find和List.indexof这两个函数(因为不能排序并且有相同的);
可以这样做要两层For循环逐一对比就可以得到正确的答案,
但是效率却很低,这样要做300002次的运算,如果数据再大的话就更恐怖了n2次运算。
有没有其他更快的方法或者算法进行改良提高效率?先谢谢大家。
[解决办法]
一楼就是传统的计数排序的前一部分
[解决办法]
占楼学习问个delphi for循环的效率改进有关问题
[解决办法]
学习一楼,如果只是为了统计出重复的次数的话,可以优化下,减少10000次循环

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Classes;

var
  List: TStrings;

procedure BuildRandomList(AList: TStrings);
var
  I: Integer;
begin
  Randomize;
  AList.Clear;
  for I := 0 to 30000 - 1 do
    AList.Add(IntToStr(Random(9999)));
end;

function CountRepeat(AList: TStrings): Integer;
var
  I, J: Integer;
  LBuffer: array [0..9999] of Byte;
begin
  FillChar(LBuffer, SizeOf(LBuffer), 0);
  Result := 0;
  for I := 0 to AList.Count - 1 do
  begin
    J := StrToInt(AList[I]);
    Inc(LBuffer[J]);
    if LBuffer[J] > 1 then
    begin
      Inc(Result);
      Writeln(Format('%d  %d', [J, LBuffer[J]]));
    end;
  end;
end;

begin
  List := TStringList.Create;
  BuildRandomList(List);

  Writeln(IntToStr(CountRepeat(List)));

  List.Free;

  Sleep(100000);
end.

热点排行