Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и структ дан.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
233.51 Кб
Скачать

Нелинейные коллекции

Иерархическая коллекция – это масса элементов, которые разделяются по уровням. В иерархическую коллекцию входят все разновидности деревьев. А дерево - это структура, состоящая из узлов и ветвей, и имеющих направление от корня ко всем последующим потокам.

HEAP –дерево, особая версия дерева, в котором самый маленький элемент всегда занимает корневой узел. Удаление корневого узла вызывает такую реорганизацию дерева, что маленький элемент вновь занимает корень такого дерева. Эта структура использует очень эффективные алгоритмы реорганизации дерева, просматривая только короткие пути от корня вниз к концу дерева. ХЕАП-дерево может использоваться для упорядочивания списка элементов.

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

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

Граф – структура данных G=<V,E>. Дающая набор вершин и связей, связывающих эти вершины.

Сеть – это особая форма графа, которая присваивает вес каждой связи.

ЛАБА – построение таблицы хеширования.

Хеширование. Хеш-функции. Методы устранения коллизий.

Хеширование является самым быстродействующим из известных методов программного поиска. Термин хеширование произошел от английского глагола «to hash» (крошить, нарезать, делать месиво). Для методов хеширования встречаются следующие термины: рассеянная память, адресация вразброс, адресация с перемешиванием, ключевые преобразования, расстановка. Данный метод не требует никакого упорядочивания или сортировки ключевых слов. Высокая скорость выполнения операции хеширование обусловлена тем, что элементы данных запоминаются и впоследствии выбираются из ячеек памяти, адреса которых являются простыми арифметическими функциями содержимого соответствующих ключевых слов. Адреса, получаемые из ключевых слов методом хеширования, называются хеш адресами. Таким образом, идея хеширования состоит в том, чтобы взять некоторые характеристики ключа с помощью, так называемой хеш-функции и взять это значение в качестве адреса начала поиска, то есть k храниться по адреса F(k). С хеш-функцией связана так называемая хеш-таблица, ячейки которой пронумерованы и хранят сами данные или ссылки на данные. Однако функции, дающие неповторяющиеся значения редки даже в случае большой таблицы. Возможно, что найдутся различные ключи ki=!kj, для которых F(ki)=F(kj). Таким образом, часто отображение, осуществляемое хеш-функцией, является отображение многие к одному и приводит к коллизии. При возникновении коллизии два или более ключа ассоциируются с одной и той же ячейкой хеш-таблицы. Поскольку два ключа не могут занимать одну и ту же ячейку в таблице, необходимо выбрать стратегию разрешения коллизий, то есть метод, указывающий альтернативное местоположение элемента. Следовательно, чтобы использовать хеш-таблицу, программист должен выбрать хеш-функцию и метод разрешения коллизий.

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

1. Метод деления. Требует двух шагов. Сперва, ключ преобразуется в целое число, а затем полученное значение вписывается в диапазон 0….(n-1) с помощью оператора получения

остатка.

2. Метод умножения. Вначале, с его помощью получается нормализованный хеш-адрес h(k), принадлежащий интервалу [0,1). h(k) Назовем величину, вычисляемую следующим образом (c*k) mod 1, где k – элементы, ключи, c- некоторая константа [0,1). Итоговый хеш-адрес обозначим f(k) вычисляется как h(k)*t, где t – размер хеш-таблиц. Качество хеширования по этому методу зависит от выбора константы C. Хорошие результаты дает константа C = 0,618034 (золотое сечение).

3. Метод середины квадрата. Предусматривает преобразование ключа в целое число, возведение его в квадрат и возвращение в качестве значения функции последовательности цифр, извлеченного из середины этого квадрата. F(k)= k2 % 100.

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

5. Метод усечения. При этом подходе из ключа выделяются определенные биты, которые определяют хеш-адрес элемента. 761819 > 76|18|19.

Не смотря на то, что два или более ключей могут хешироваться одинаково , они не могут занимать в хеш таблиц одну и ту же ячейку. Остается два пути: 1. Найти для нового ключа другую позицию в таблице. 2. Создать для каждого значения хеш-функции отдельный список, в котором будут все ключи, отображающиеся при хешировании в это значение. Первый вариант получил название открытая адресация с линейным или квадратичным опробованием. Второй – метод цепочек.

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

В линейном пробинге к хеш адресу прибавляется или вычитается по единице, пока не обнаружится незанятая ячейка. аi =(a0+i)mod t. аi – номер пробы, а t - размер хеш таблицы. T >= 1,5*n. При квадратичной пробе расчет ведется по той же формуле, но при i^2. N - Общее количество ключей. Небольшой недостаток квадратичных проб заключается в том, что при поиске пробуются не все строки таблицы, т.е. при включении элемента может не найтись свободного места, хотя на самом деле оно есть. Если размер T – простое число, то при квадратичных пробах рассматривается, по крайней мере, половина таблицы.