Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации 2часть / Лекция_30_Хеширование.ppt
Скачиваний:
27
Добавлен:
11.05.2015
Размер:
183.81 Кб
Скачать

метод Readd(key:Tkey):Tinf;

продолжение

Begin //ключ не в первой записи

While (sp.A<>Nil) and (sp.A.inf.key<>key)

do sp:=sp^.A;

if sp.A<>Nil then begin

Result:=sp.A.inf;

sp1:=sp.A;

sp.A:=sp.A.A;

dispose(sp1); Dec(n);

end

else ShowMessage('ключ не найден');

end;

End;

07/02/19

21

Чтение c удалением метод Readd(key:Tkey):Tinf;

Другой вариант программной реализации

Procedure THesh.Readd;

begin

i:=key mod M;

sp:=H[i]; sp1:=sp;

While (sp<>Nil) and (sp^.inf.key<>key) do

begin sp1:=sp; sp:=sp^.A end;

if sp<>Nil then begin

Result:=sp^.inf;

if sp1=sp then H[i]:=sp^.A

else sp1^.A:=sp^.A;

dispose(sp); Dec(n);

end

else ShowMessage('ключ не найден');

end;

end.

07/02/19

22

 

Пример организации работы с классом THesh

uses unit1;

var H1:THesh;

M0,n,i:word;

Inf:Tinf;

Key:Tkey;

//кнопка создать таблицу

Procedure TForm1.Button1Click(Sender:TObject);

begin M0:=StrToInt(Edit3.Text);

H1:=THesh.create(M0);

end;

07/02/19

23

Кнопка занести данные из StringGrid в хеш-таблицу

procedure TForm1.Button2Click(Sender: TObject);

begin

n:=StrToInt(Edit4.Text);

for i:=1 to n do begin

Inf.Fio:=StringGrid1.Cells[0,i];

Inf.key:=StrToInt(StringGrid1.Cells[1,i]);

H1.Add(inf);

end;

end;

07/02/19

24

Кнопка добавить новую запись в хеш-таблицу

procedure TForm1.Button4Click(Sender: TObject);

begin

Inf.Fio:=Edit1.Text;

Inf.key:=StrToInt(Edit2.Text);

H1.Add(inf);

end;

07/02/19

25

Кнопка прочесть и удалить запись с заданным ключом

procedure TForm1.Button3Click(Sender: TObject);

begin

key:=StrToInt(Edit2.Text);

H1.Readd(key,Inf);

Edit1.Text:=Inf.Fio;

end;

07/02/19

26

Выдать и удалить хеш-таблицу

procedure TForm1.Button5Click(Sender: TObject);

begin

StringGrid1.rowcount:=H1.n;

H1.Free(StringGrid1);

end;

07/02/19

27

Преимущество рассмотренного метода заключается в том, что связанные хэш-таблицы никогда не переполняются, довольно просто осуществляется вставка, удаление и поиск элементов.

Недостаток таких таблиц в том, что если данные недостаточно равномерно перемешаны по ключу, то некоторые списки могут оказаться очень длинными в то время как большинство других будут пустыми, при этом поиск будет замедляться.

Для избавления от этого недостатка нужно придумать другую функцию хеширования.

Иногда используют следующую функцию

i:=(Key+P) Mod M,

где Р - простое число.

Можно Р генерировать с помощью датчика случайных чисел, при этом вначале записи и поиска датчик устанавливается в одинаковое начальное положение

07/02/19

28

Другие способы хеширования

Перемешанная таблица.Метод блоков

07/02/19

29

Перемешанная таблица

Этод метод послужил поводом, для названия (хеширование).

Используется простой массив H[i], функция хеширования i=Key mod M.

Алгоритм разрешения конфликтов следующий:

Если очередная позиция i занята, тогда ищется первая свободная позиция и туда помещается элемент. Для уменьшения эффекта кластеризации можно использовать функцию хеширования с датчиком случайных чисел, описанную выше.

i=3

 

 

 

x

x

 

 

 

x

x

0

1

2

3

4

.

.

.

.

M-1

 

07/02/19

 

 

 

 

 

 

30