Einzelnen Beitrag anzeigen

Horst_

Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
 
#17

AW: Hashtable, wie benutzen?

  Alt 24. Apr 2012, 10:10
Hallo,

ich bekomme den Fehler auch nicht hin
Ich habe mal DictFind.pas geändert.
Es wird jetzt eine lineare Liste erzwungen.
Delphi-Quellcode:
function myRandom(i : TDictIntType):TDictIntType;inline;
begin
  result := i*ccInitialSize+17;//random(i);
end;
denn alle erzeugten Zahlen Wert sind verschieden, aber (Wert mod ccInitialSize) = 17.
Delphi-Quellcode:
program DictFind;
{$IFDEF FPC}
  {$MODE DELPHI}
  {$OPTIMIZATION ON}
  {$OPTIMIZATION REGVAR}
  {$OPTIMIZATION PEEPHOLE}
  {$OPTIMIZATION CSE}
  {$OPTIMIZATION ASMCSE}
{$ELSE}
  {$APPTYPE CONSOLE}
{$ENDIF}

uses
  sysutils,csDictionary;
  
const
  LAENGE = 25*1000*1000;
  RANDOMRANGE = 1000*100;
// RANDOMRANGE = High(tDictIntType);

type
  tArr64 = array of TDictIntType;
var
   t1,t0,dt : TDateTime;
   Wert : TDictIntType;
   dummy : Pointer;
   i,j: integer;

   A64 : tarr64;
   TestHash : TIntegerDictionary;
   
function myRandom(i : TDictIntType):TDictIntType;inline;
begin
  result := i*ccInitialSize+17;//random(i);
end;

BEGIN
  randomize;
  setlength(A64 ,LAENGE);
  TestHash:= TIntegerDictionary.create;

  t0 := time;
  For i := low(A64) to High(A64) do
    Wert := myrandom(i);//random(RANDOMRANGE);
    
  t1 := time;
  dt := t1-t0;
  Write('Erzeugen von ',LAENGE,' Zufallszahlen [0..',Randomrange-1);
  writeln(FormatDateTime('] hh:nn:ss,zzz',dt));

  t0 := time;
  j := low(A64);
  For i := low(A64) to High(A64) do
    begin
    Wert := myrandom(i);//myrandom(RANDOMRANGE);
    IF TestHash.Add(Wert,Pointer(j)) then
      begin
      A64[j] := Wert;
      inc(j);
      end;
    end;
  setlength(A64,j);
  t1 := time;
  Write('TotalCOunt :',TestHash.TotalCount:10);
  Write('Einfuegen von ',j,' verschiedenen Daten in ');
  writeln(FormatDateTime(' hh:nn:ss,zzz',t1-t0-dt));

  For i := low(A64) to 10 do
    writeln(i:10,A64[i]:20,TestHash.find(A64[i],dummy):8,integer(dummy):10);
  writeln(j-1:10,A64[j-1]:20,TestHash.find(A64[j-1],dummy):8,integer(dummy):10);
  t0 := time;
  testHash.free;
  t1 := time;
  Write('Aufloesen der Hashmap in ');
  Writeln(FormatDateTime('hh:nn:ss,zzz',t1-t0));
  setlength(A64,0);
  readln;
END.
Ich erhalte auch so keine Fehlermeldung mit Freepascal 2.6.0 /Win7

Gruß Horst
  Mit Zitat antworten Zitat