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 Uses
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 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
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 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
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;
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
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
   ...