Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уровни описания структур данных.docx
Скачиваний:
10
Добавлен:
22.09.2019
Размер:
62.72 Кб
Скачать
  1. Двоичное дерево. Физическое представление. Прошивка.

Физическое представление дерева удобнее всего делать на динамические структуры. Однако, его можно представить и на массив. Цена вставки и удаления из такого дерева очень высока. В сплошном представлении не тратится память на связывание 2х элементов.

Физическое представление на динамических структурах:

Функция Добавить добавляет элемент в дерево.

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

Функция распечатки дерева Используется КЛП обход.

Прошивка дерева позволяет обходить дерево не рекурсивно без использования стека, добавляя к листу ссылку на узел дерева, который был бы доступен при рекурсивном ЛКП обходе. В этом случае каждый узел дерева имеет еще 2 поля ltag rtag, которые при истинности одного из них означают что правая/левая ссылка ведет не на потомка этого узла, а на предка, который был бы доступен при ЛКП обходе. Таким образом дерево линеаризовано и может быть помещено в список или очередь. Особо необходимо отметить правопрошитые деревья, в которых используется только правая связь-нить.

  1. Алгоритмы обхода деревьев.

Обход дерева – просмотр или перебор всех узлов дерева. Особенность обхода состоит в том, что просматриваются все узлы дерева в некотором порядке, и притом каждый узел обрабатывается только один раз.

Для двоичных деревьев определены 3 обхода: прямой, обратный, концевой.

Прямой(КЛП)

Обратный(ЛКП)

Концевой(ЛПК)

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

Обход дерева общего вида сложнее, чем обход двоичного дерева. Выделяют 2 таких обхода:

Обход в глубину

  1. Если дерево пусто, конец обхода

  2. Берется корень

  3. Выполняется поиск в глубину для поддерева старшего сына

  4. Выполняется поиск в глубину для следующего брата

Обход в ширину

  1. Поместить в пустую очередь корень дерева

  2. Если очередь узлов пуста, то конец обхода

  3. Извлечь первый элемент из очереди узлов и поместить в ее конец всех его сыновей по старшенству

  4. Повторить с п.2

  1. Особенности представления и обработки деревьев общего вида.

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

Существует 2 обхода деревьев общего вида: в глубину и в ширину.

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

  1. Деревья выражений.

Обходя дерево выражений разными способами мы можем получить 3 разнофиксных записи одного и того же выражения:

КЛП – префиксную (польскую)

ЛКП – инфиксную

ЛПК – постфиксную (обратную польскую)

Для построения дерева выражения из постфиксной записи необходимо инвертировать эту запись и добавлять в дерево по следующему алгоритму:

  1. Если знак, то добавляем следующий операнд в правое поддерево

  2. Если константа или переменная, то добавляем в правое, возвращаемся на уровень выше.

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

Для построения дерева из инфиксной записи необходимо преобразовать ее в постфиксную, используя метод Дейкстры.

Для префиксной записи можно использовать алгоритм, подобный преобразованию из постфиксной, только не инвертировать и записывать в левое поддерево до константы.

  1. Деревья поиска.

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

Поиск в дереве поиска может проводиться нерекурсивно.

Построение дерева поиска, включение и исключение вершин из него. Построение производится следующим образом:

  1. Если текущее поддерево(дерево) пусто, ключ записывается как корень, ссылки на левое и правое поддерево обнуляются., если нет – то к п.2

  2. Если ключ узла меньше чем включаемый, то перемещаемся вправо, больше – влево и переходим к п. 1

Удаление описывается выше.

Один из примеров использования дерева поиска является составление частотного словаря. В этом случае при совпадении искомого ключа с найденым счетчик найденного увеличивается на 1, в противном случае создается новый узел для нового слова.

  1. Задача поиска. Простые методы поиска в последовательностях и таблицах.

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

Линейный поиск заключается в последовательном просмотре массива как списка с той же линейной сложностью О(N) Просмотр выполняется в цикле до тех пор, пока искомый элемент не найден либо пока не наткнулись на конец массива. Для упрощения поиска можно ввести барьерный элемент который будет равен искомому и поставить его в конец массива, тогда при проходе по циклу необходимо только 1 условие.

Этот алгоритм единственно возможный для структур данных с последовательным доступом.

Двоичный поиск возможен только на упорядоченных структурах данных. Он позволяет находить искомый элемент за log(n) операций. Этот поиск основан на методе дихотомии, когда при каждом сравнении отбрасывается половина из рассматриваемого множества. Для этого ключ искомый сравнивается с элементом из середины рассматриваемого множества, и в зависимости от того, больше или меньше значение поиск продолжается на левой или правой половине предыдущего множества.

Поиск в таблицах. Ключ в таблицах обычно является составным и имеет регулярную структуру. Чаще всего сам является массивом или строкой. Строку удобнее всего представлять как набор символов с барьерным элементом, который является обычно знаком с минимальным порядковым номером( chr(0) в паскале ‘\0’ в си) Тогда поиск в таблице будет осуществлен посимвольным сравнением ключей. Для того, чтобы ускорить поиск, можно осуществить двоичный поиск в лексикографически-упорядоченной таблице.