Pour tester un gros nombre de mots si ils existes ou non sur une liste le traditionnel TStringList n'offre pas une bonne performance même avec la property sorted à true mais il y a une autre type de liste TStringHash implémentée dans l'unité IniFiles de Delphi7(n'existe pas sous Delphi5).En fait avec ce type de liste on peut tester la présence un million de mots sur un dico de cent milles mots par seconde c'est l'algo de hachage en premier ordre puis la taille de l'index qui détermine sa performance mais mais elle ne gère pas bien les doublons
N'oublier pas d'ajouter IniFiles dans les UsesPour tester c'est simple lorsque la méthode renvoie -1 l'élément n'existe pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 var Hachage: TStringHash; procedure TForm1.FormCreate(Sender: TObject); var TmpList:TStringList; i :integer; begin Hachage:=TStringHash.Create(100000);//taille de l'index omis vaut 256 TmpList:=TStringList.Create(); TmpList.Duplicates:=dupIgnore; // Chargement du fichier TmpList.LoadFromFile('C:\Mots.txt'); //Création des hash pour les mots du dico for i:=0 to TmpList.Count-1 do Hachage.Add(TmpList[i],i); // TmpList.Free(); FreeAndNil(TmpList); end;
Pour tester plusieurs mots c'est normal on passe par une boucle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure TForm1.Button3Click(Sender: TObject); var Position:integer; begin Position:= Hachage.ValueOf('type'); if (Position > -1) then ShowMessagefmt('Mot existe sa position est : %d',[Position+1]) else ShowMessage('Mot n''existe pas'); end;Pour travailler avec une autre algo
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 for i:=0 to ListeDesMots.Count-1 do if(Hachage.ValueOf(ListeDesMots[i]) > -1) then begin //Opérations avec un mot qui existe end else begin //Opérations avec un mot qui n'existe pas end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 TPersoStringHash=class(TStringHash) protected function HashOf(const Key: string): Cardinal; override; end; var Form1: TForm1; Hachage: TPersoStringHash; implementation {$R *.dfm} //Pour limiter les collisions if faut respecter les règles suivantes const NHASH = 100003;//doit etre un nombre premier BHASH = 1 shl 8; //modifier l'exposant function TPersoStringHash.HashOf(const Key: string): Cardinal; var i:integer; begin result:=0; for i := 1 to Length(Key) do result:= ((result * BHASH) + Ord(Key[i]))mod NHASH; end; procedure TForm1.FormCreate(Sender: TObject); var TmpList:TStringList; i :integer; begin Hachage:=TPersoStringHash.Create(NHASH);//taille de l'index omis vaut 256 ...
Partager