Всем добрый вечер! Хочу обратиться к вам за помощью)
Имеется программа..её нужно переделать по следующие требования :
Варианты задания
1. Тип ключа:
а) целый;
2. Метод хеширования:
в) деление многочленов
k записывается в двоичной системе: k=2nbn+…+2b1+b0
и в форме многочлена: k(t)=tnbn+…+tb1+b0, M=2m;
остаток от деления его на постоянный многочлен
c(t)=tmcm+ tm-1cm-1 …+tc1+c0,
записанный в двоичной системе – h(k).
3. Разрешение коллизий:
б) метод внутренних цепочек;
Вот собственно программа , которую нужно переделать :
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
SGTable: TStringGrid;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
Procedure Add_Key(S : String);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{
Задание 3. Хеширование
Порядок выполнения задания и требования к нему
1. Разработать алгоритм преобразования ключа, если это необходимо.
2. Разработать алгоритм, соответствующий хеш-функции.
3. Разработать алгоритм разрешения коллизий.
4. Разработать и отладить программу на Delphi, реализующую алгоритмы пп. 1-3.
5. Интерфейс программы должен включать хеш-таблицу, поле для ввода ключа,
счетчик коллизий, необходимые управляющие элементы и пояснения.
6. В программе необходимо реализовать как процедуру записи ключа
в таблицу, так и процедуру его поиска. Процедуру удаления ключа
реализовывать не обязательно.
7. Текст программы должен содержать количество комментариев,
необходимое для понимания того, что автор выполнил именно то
задание, которое ему указано.
Варианты задания
1. Тип ключа:
б) строковый.
2. Метод хеширования:
а) метод деления: h(k) = K mod M, M - простое
3. Разрешение коллизий:
г) квадратичное опробование: hi(k)=h0(k)+ci+di2, c, d - константы;
}
const m=19; // РАЗМЕР ХЭШ ТАБЛИЦЫ
const c=7; // КОНТСАНТА, ИСПОЛЬЗУЕМАЯ ПРИ РАЗРЕШЕНИЕ КОЛИЗИЙ
const d=9; // КОНСТАНТА, ИСПОЛЬЗУЕМАЯ ПРИ РАЗРЕШЕНИЕ КОЛИЗИЙ
var
Key : array[0..m] of Integer; // ХЭШ ТАБЛИЦА
ColizCount : Integer; // КОЛ-ВО КОЛИЗИЙ
// ПРЕДСТАВЛЕНИЕ СТРОКИ ВВИДЕ ОДНОГО ЧИСЛА (ЦЕЛОЕ)
Function StrInInt(s: string): Integer;
var
i : integer; //
n : integer; //
Return : Integer; //
begin
Return:=0; //
for i:=1 to Length(s) do
Return:=Return*2+Ord(s[i]);
StrinInt:=Return;
end;
// ХЭШ ФУНКЦИЯ
Function Hash(k : integer): Integer;
Begin
k:=k mod m+1;
Hash:=k;
end;
// ОТЛАДКА КОЛИЗИЙ
Function Col_solution(k : Integer): Integer;
var
i : integer; // СЧЕТЧИК КОЛИЗИЙ
k0 : integer; // СТАРТОВОЕ ЗНАЧЕНИЕ ХЭШ ФУНКЦИИ
begin
i:=1;
k0:=k;
Repeat
i:=i+1;
k:=(Hash(k)+c*i+d*i*i) mod (m+1);
//ПОКА НЕ НАШЛИ СВОБОДНУЮ СТРОКУ ИЛИ ЗНАЧЕНИЕ к НЕ РАВНО СТАРТОВОМУ ЗНАЧЕНИЮ,
// ЧТО ОЗНАЧАЕТ ТАБЛИЦА ПЕРЕПОЛНЕНА
until (Key[k]=0) or (K0=k);
if k0=k then k:=-1;
ColizCount:=i; // ИТОГОВОЕ КОЛИЧЕСТВО КОЛИЗИЙ
Col_Solution:=k;
end;
// ДОБАВИТЬ КЛЮЧ В ТАБЛИЦУ
Procedure TForm1.Add_Key(S : String);
var
i : Integer; //
k : integer; //
Begin
k:=Hash(0);
if key[k]<>0 then k:=Col_solution(Hash(k));
if k=-1 then showMessage('Таблица переполнина')
else
Begin
key[k]:=StrInInt(s);
SgTable.Cells[1,k]:=s+' - '+IntToStr(StrInInt(Edit1.Text));;
SgTable.Cells[2,k]:=IntToStr(k);
SgTable.Cells[3,k]:=IntToStr(ColizCount);
End;
End;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Add_Key(Edit1.Text);
end;
procedure TForm1.FormCreate(Sender: TObject);
var i : integer; //
begin
SGTable.RowCount:=m+1;
sgTable.ColCount:=4;
SgTable.Cells[0,0]:='Номер Строки';
SgTable.Cells[1,0]:='Ключ';
SgTable.Cells[2,0]:='Хэш значение';
SgTable.Cells[3,0]:='Кол-во колизий';
for i:=0 to m do
begin
sgtable.Cells[0,i+1]:=IntToStr(i+1);
key[i]:=0;
end;
end;
end.