Misafirler için gizlenen link, görmek için
Giriş yap veya üye ol.
Hash fonksiyonu ile ilgili delphide bir örnek hazırladım, meraklısı*için ;
Misafirler için gizlenen link, görmek için
Giriş yap veya üye ol.
const MAX_ROW = 10; // Hash tablomuz maximum satır sayısı
type
* ROW * * = ^TROW; // Satır bağlı listemiz
* TRow * *= record
* Index * : Integer;
* Numara *: Integer;
* Sonraki : ROW;
end;
type
* HASH_TABLE *= ^THASH_TABLE; // Hash Tablomuz
* THASH_TABLE = record
* ROWS * * * *: Array of ROW;
end;
var
*Form1: TForm1;
*xHASH_TABLE : HASH_TABLE;
implementation
{$R *.dfm}
procedure Baslangic_Deger_Ata;
begin
*Var Ind : Integer;
*for Ind := Low(xHASH_TABLE.ROWS) to High(xHASH_TABLE.ROWS) do
*begin
* *New(xHASH_TABLE.ROWS[Ind]);
* *xHASH_TABLE.ROWS[Ind]^.Index * := -1; // Boş olup olmadığı kontrol edilebilir.
* *xHASH_TABLE.ROWS[Ind]^.Numara *:= -1;
* *xHASH_TABLE.ROWS[Ind]^.Sonraki := nil;
*end;
end;
procedure Ekle(ANumara:Integer);
begin
*Var xRow *: ROW;
*Var Adres : Integer;
*Adres := ANumara mod MAX_ROW;
*if xHASH_TABLE.ROWS[Adres].Index = -1 then // Hash tablosunda ilgili satır boş ise
*begin
* *xHASH_TABLE.ROWS[Adres]^.Index *:= Adres;
* *xHASH_TABLE.ROWS[Adres]^.Numara := ANumara;
*end
*else // Bağlı liste mantığında sona eklenecek, Collision(Çarpışma)
*begin
* *New(xRow); //Bağlı listede yeni alan açıldı
* *if xRow = nil then // Ramde alan kalmadı, düşük ihtimal
* *begin
* * *Application.MessageBox(PCHAR('Ram''de alan kalmadı'),PCHAR('UYARI'),MB_OK);
* * *Exit;
* *end
* *else
* *begin
* * *xRow^.Index * := Adres;
* * *xRow^.Numara *:= ANumara;
* * *xRow^.Sonraki := nil;
* * *Var xTemp : ROW;
* * *xTemp := xHASH_TABLE.ROWS[Adres];
* * *while xTemp^.Sonraki nil do // Satırdaki son elemana kadar gittik
* * * *xTemp := xTemp^.Sonraki;
* * *xTemp^.Sonraki := xRow;
* *end;
*end;
end;
procedure Listele(AMem:TMemo);
begin
*AMem.Lines.Clear;
*Var xTemp : ROW;
*Var Ind * : Integer;
*Var Ind2 *: Integer;
*for Ind := Low(xHASH_TABLE.ROWS) to High(xHASH_TABLE.ROWS) do
*begin
* *AMem.Lines.Add(Format('%d. Satıra İlk değer %d',[Ind,xHASH_TABLE.ROWS[Ind]^.Numara]));
* *xTemp := xHASH_TABLE.ROWS[Ind].Sonraki;
* *Ind2 *:= 2;
* *while xTemp nil do
* *begin
* * *AMem.Lines.Add(Format('%d Satıra %d. değer %d',[Ind,Ind2,xTemp^.Numara]));
* * *xTemp := xTemp^.Sonraki;
* * *Inc(Ind2);
* *end;
* *AMem.Lines.Add('-------------------------');
*end;
end;
function Ara(ANumara:Integer):ROW;
begin
*Var xTemp : ROW;
*Var Adres : Integer;
*Adres *:= ANumara mod MAX_ROW;
*Result := nil;
*if xHASH_TABLE.ROWS[Adres].Index -1 then // Tabloda varsa
*begin
* *xTemp := xHASH_TABLE.ROWS[Adres];
* *while xTemp nil do
* *begin
* * *if xTemp^.Numara = ANumara then
* * *begin
* * * *Result := xTemp;
* * * *Break;
* * *end;
* * *xTemp := xTemp^.Sonraki;
* *end;
*end;
end;
procedure TForm1.BtnHashAraClick(Sender: TObject);
begin
*Var Aranan : ROW;
*Aranan := Ara(22);
*if Aranan nil then
* *ShowMessage('Buldum')
*else
* *ShowMessage('Bulamadım');
end;
procedure TForm1.BtnHashClick(Sender: TObject);
begin
*//İlk İşlemler
*New(xHASH_TABLE);
*SetLength(xHASH_TABLE^.ROWS,MAX_ROW);
*Baslangic_Deger_Ata;
*Ekle(1); // *Üçü aynı satırda
*Ekle(11);
*Ekle(21);
*Ekle(2);
*Ekle(12); // İkisi aynı satırda
*Ekle(3); // *İkisi aynı satırda
*Ekle(13);
*Listele(memHashTable); // Listele
end;