Inf:Tinf;

Key:Tkey;

procedure TForm1.Button1Click(Sender: TObject);

begin //создать

M0:=StrToInt(Edit3.Text);

H1:=TH.create(M0);

end;

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;

procedure TForm1.Button3Click(Sender: TObject);

begin //найти прочесть и удалить

key:=StrToInt(Edit2.Text);

H1.Red(key,Inf);

Edit1.Text:=Inf.Fio;

end;

procedure TForm1.Button4Click(Sender: TObject);

begin // добавить новую запись

Inf.Fio:=Edit1.Text;

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

H1.Add(inf);

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

StringGrid1.rowcount:=H1.n;

H1.Free(StringGrid1);

end;

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

Для избавления от этого недостатка нужно придумать другую функцию хеширования. Иногда используют следующую функцию i:=(Key+p) Mod M, где Р - простое число. Можно Р генерировать с помощью датчика случайных чисел, при этом вначале записи и поиска датчик устанавливается в одинаковое начальное положение.

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

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

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

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

Х

Х

Х

Х

Х

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

Попробуйте свои силы и напишите методы работы с этой таблицей.

Метод блоков.

Используется массив одномерных массивов одинакового размера (блоков).

Type

Tblok=array[1..P] of Tinf;

Var H:array[0..M-1] of Tblok;//массив из блоков

H1,H2:array[0..M-1] of Tblok;//блоки переполнения

Размещаются элементы следующим образом:

Вначале обычная функция i:=Key mod M находит номер блока и размещает в H[i] элемент (в конце блока). Если i-й блок переполнен, то элемент помещается в очередной блок переполнения H1[i]. Этот способ используется при хранении данных на файле. Запись и чтение в (из) файла осуществляется поблочно. Это позволяет значительно ускорить поиск, т.к. чтение из файла по одной записи медленнее, чем сразу блоком.

Практический раздел Указания по выбору варианта

Рабочей программой дисциплины «Основы алгоритмизации и программирование» в первой части предусмотрено выполнение двух индивидуальных практических работ и двух контрольных работ. В работах необходимо выполнить задание в соответствии с вариантом.

Контрольные работы и индивидуальные практические работы должны быть оформлены в соответствии с общеустановленными нормами и правилами, предъявляемыми к выполнению контрольных работ и практических работ.

Выбор вариантов задания осуществляется студентом самостоятельно на основании двух последних цифр номера зачетной книжки из данных табл. 1.