06-01-2019, Saat: 21:18
Hash function Nedir?(Sadi Evren)
Hash fonksiyonu ile ilgili delphide bir örnek hazırladım, meraklısı için ;
Sample Link
Hash fonksiyonu ile ilgili delphide bir örnek hazırladım, meraklısı için ;
Sample Link
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;
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..