1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
uses
System.Generics.Collections,
System.DateUtils;
procedure TForm1.FormCreate(Sender: TObject);
begin
var List: TArray<Integer>;
SetLength(List, 15000);
for var I := 0 to Length(List) - 1 do
List[I] := Random(300000) + 1;
var bits : TArray<Cardinal>;
SetLength(bits, 300000 div 32);
for var I := 0 to Length(List) - 1 do
begin
var N := List[I] - 1;
var O := N div 32;
bits[O] := bits[O] or (1 shl (N mod 32));
end;
var bools: TArray<Boolean>;
SetLength(bools, 300000);
for var I := 0 to Length(List) - 1 do
begin
bools[List[I] - 1] := True;
end;
var N := List[0];
TArray.Sort<Integer>(List);
var Found: Integer;
if TArray.BinarySearch<Integer>(List, 12, Found) then
ShowMessage('12 est à l''index ' + Found.ToString)
else
ShowMessage('12 n''est pas dans la liste');
if TArray.BinarySearch<Integer>(List, N, Found) then
ShowMessage(N.ToString + ' est à l''index ' + Found.ToString)
else
ShowMessage('ça c''est pas normal !');
// vérification
for var I := 0 to 300000 - 1 do
begin
var O := I div 32;
var B := bits[O] and (1 shl (I mod 32));
if ((B <> 0) <> TArray.BinarySearch<Integer>(List, I + 1, Found))
or ((B <> 0) <> bools[I]) then
raise Exception.Create('Erreur !');
end;
// for var I := 0 to Length(List) - 1 do
// ListBox1.Items.Add(List[I].ToString);
// ListBox1.ItemIndex := Found;
// test1
var T1 := Now;
var Count := 0;
for var I := 1 to 300000 do
begin
if TArray.BinarySearch<Integer>(List, I, Found) then
Inc(Count);
end;
var T2 := Now;
ListBox1.Items.Add('TArray.BinarySearch = ' + Count.ToString + ' in ' + MillisecondsBetween(T1, T2).ToString + 'ms');
// test2
T1 := Now;
Count := 0;
for var I := 0 to 300000 - 1 do
begin
if bits[I div 32] and (1 shl (I mod 32)) <> 0 then
Inc(Count);
end;
T2 := Now;
ListBox1.Items.Add('bits[] = ' + Count.ToString + ' in ' + MillisecondsBetween(T1, T2).ToString + 'ms');
// test3
T1 := Now;
Count := 0;
for var I := 0 to 300000 - 1 do
begin
if bools[I] then
Inc(Count);
end;
T2 := Now;
ListBox1.Items.Add('bools[] = ' + Count.ToString + ' in ' + MillisecondsBetween(T1, T2).ToString + 'ms');
end; |
Partager