Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bilety_po_AiP.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.1 Mб
Скачать
  1. Метод квадратичного рехеширования.

Отличается от линейного тем, что шаг перебора элементов не линейно зависит от номера попытки найти свободный элемент

a = (h(key) + c*i2) mod N

Благодаря нелинейности такой адресации количество кластеров уменьшается.

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

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

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

  1. Рекурсивные типы данных: определение, примеры.

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

Пример описания такой структуры данных:

type

PListElement = ^TListElement;

TListElement = record

<Произвольные поля записи>

NextElement: PListElement;

End;

Здесь сначала описывается тип – указатель PListElement на запись типа TListElement. Затем идет описание самого типа записи, одно из полей которой имеет тип PListElement.

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

Деревья:

type refnode=^node;

node=record

inf:integer;

left, right: refnode

end;

Графы:

Type refnode=^node;

refarc=^arc;

node=record {список вершин}

Id:integer; {номер вершины}

infnode:integer; {вес}

next:refnode; {указатель на следующую вершину в списке}

arclist:refarc {указатель на список дуг}

end;

arc=record {список дуг определенной вершины}

infarc:integer; {вес}

next:refarc; {указатель на следующую дугу, исходящую из данной вершины}

adj:refnode {указатель на вершину, в которую ведет данная дуга}

end;

[ЛАБРИС 19:23:00]

>> говоришь определение. говоришь что рек типы используют для описания деревьев и списков, например мы на паскале задрили, вот так вот описывали + интересно заметить, что паскаль поддерживает только косвенную рекурсию в описании типа

  1. Операции над линейными списками: создание списков, включение элементов в списки (рассмотреть различные способы). Виды связных списков.

Работа с динамическими величинами связана с использованием еще одного типа данных — ссылочного типа. Величины, имеющие ссылочный тип, называют указателями.

Указатель содержит адрес поля в динамической памяти, в которой хранится величина определенного типа. Сам указатель располагается в статической памяти.

Выделение памяти:

Память под динамическую величину, связанную с указателем, выделяется

в результате выполнения стандартной процедуры NEW. Формат обращения к

этой процедуре:

NEW(<указатель>);

Освобождение памяти

Стандартная процедура, позволяющая освобождать память от данных, потребность в которых отпала:

DISPOSE(<указатель>);

Например, если динамическая переменная P^ больше не нужна, то оператор:

DISPOSE(P) удалит ее из памяти.

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

В односвязном списке каждый элемент состоит из двух различных по

назначению полей: содержательного поля (поле данных) и служебного поля

(поля указателя), где хранится адрес следующего элемента списка. Поле

указателя последнего элемента списка содержит нулевой указатель (Nil),

свидетельствующий о конце списка.

type reference=^element;

element=record

inf:integer;

next:reference;

end;

Элементы списка создаются во время работы программы по мере

необходимости. Также динамически между элементами устанавливаются и

разрушаются связи.

Если указатель ссылается только на следующее звено списка (как

показано на рисунке и в объявленной выше структуре), то такой список

называют однонаправленным, если на следующее и предыдущее звенья —

двунаправленным списком.

Если указатель в последнем звене установлен не в Nil, а ссылается на

заглавное звено списка, то такой список называется кольцевым. Кольцевыми

могут быть и однонаправленные, и двунаправленные списки.

Стек – это линейный список, в котором все включения и исключения (и

обычно всякий доступ) делаются в одном конце списка (в голове списка)

Очередь – это линейный список, в один конец которого добавляются

элементы, а с другого конца исключаются, элементы удаляются из начала

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

Принцип работы очереди: «первый пришел - первый вышел».

включение элемента в список

Иногда требуется включить новый элемент после или перед указанным элементом списка

(наиболее простым является вставка после указанного элемента):

procedure After(point:reference; x:integer);

var p:reference;

begin

if point<> nil then

begin

new (p);

p^.inf:=x;

p^.next:=point^.next;

point^.next:=p;

end;

end;

Вставка перед указанным (ссылкой point) элементом является более сложной, т.к. не можем двигаться по списку в направлении, обратном ссылкам. Требуется начать с головы списка и двигаться по ссылкам до элемента point, после чего вставить перед ним новый элемент:

procedure Before (var head:reference; point:reference; x:integer);

var p, here:reference;

begin

new (p);

p^.inf:=x;

if point=head then

begin

p^.next:=point;

head:=p

end

else

begin

here:=head;

while here^.next <> point do

here:=here^.next;

here^.next:=p;

p^.next:=point;

end;

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]