
- •Тема 7. ХЕШИРОВАНИЕ
- •предпосылки
- •Идея алгоритма хеширования
- •Схема хеширования
- •Хеш-функция
- •Алгоритм разрешения конфликтов
- •Алгоритм размещения записей
- •Алгоритм поиска
- •Если ключ не число?
- •Хеш-таблица на основе массива связанных списков
- •массив связанных списков
- •Используемые типы
- •Поля и методы класса ТН
- •Метод create
- •При освобождении таблицы методом (THesh.Free) все записи считываются в StringGrid и освобождается память,
- •добавить новую запись метод Add(Inf:Tinf);
- •Чтение без удаления метод Read(key:Tkey):Tinf;
- •Чтение c удалением метод Readd(key:Tkey):Tinf;
- •метод Readd(key:Tkey):Tinf;
- •Чтение c удалением метод Readd(key:Tkey):Tinf;
- •Пример организации работы с классом THesh
- •Кнопка занести данные из StringGrid в хеш-таблицу
- •Кнопка добавить новую запись в хеш-таблицу
- •Кнопка прочесть и удалить запись с заданным ключом
- •Выдать и удалить хеш-таблицу
- •Преимущество рассмотренного метода заключается в том, что связанные хэш-таблицы никогда не переполняются, довольно
- •Другие способы хеширования
- •Перемешанная таблица
- •Метод блоков
- •Контрольные вопросы
- •Задача на экзамен
метод 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 |