
- •1. Архитектура машинной памяти
- •2. Адресация памяти
- •3. Три уровня представления данных
- •4.Внутренняя структура записи
- •5. Типы структур данных
- •7. Массивы
- •8. Стеки
- •9.Очередь
- •10. Таблица
- •11. Способы размещения, основанные
- •12.Сортировка. Метод выбора
- •13. Метод обмена (пузырька)
- •14. Метод вставок
- •15. Метод подсчета
- •16. Метод Шелла
- •17.Внешняя сортировка
- •18. Последовательный поиск
- •19. Ускоренные методы поиска. Двоичный поиск. Блочный поиск
- •20.Поиск по двоичному дереву
20.Поиск по двоичному дереву
Наиболее быстрым из рассмотренных методов поиска является бинарный поиск. Однако он применим только при ограничениях: его можно использовать лишь в упорядоченных массивах записей фиксированной длины при последовательном представлении данных, а в процессе поиска необходимо выполнять определенные вычисления. Следует заметить также, что упорядоченные последовательные массивы, удобные для поиска, неудобны для ведения, так как при добавлении или удалении записей требуется перезапись всего массива.
Быстрый поиск в массивах, использующих связанное представление данных, возможен в том случае, когда структура данных имеет вид двоичного дерева. Помимо быстрого поиска в таких массивах возможно "легкое включение и удаление записей.
Поиск в структуре, имеющей вид двоичного дерева, ведется в направлении, задаваемом указателями. Правый указатель узла ведет к записи с большим ключом, левый - к записи с меньшим ключом. Вычисления номера и адреса очередной записи при этом не требуется.
Первое обращение происходит в корень дерева. При этом и каждом следующем обращении осуществляется сравнение аргумента поиска с ключом записи текущего узла и определение направления следующего обращения. Если в результате сравнения выяснилось, что значение аргумента поиска больше ключа записи текущего узла, то следующее обращение осуществляется по правому адресу связи, в противном случае следует обращение к порожденному узлу левого поддерева.
Наименьшее число сравнений и наименьшее время требуются при поиске в двоичном сбалансированном дереве (см. рис. 11.7). Среднее число сравнений при поиске в сбалансированном дереве пропорционально log2 N, где N - число узлов дерева. В хорошо сбалансированном дереве максимальное число сравнений равно числу уровней дерева.
В процессе поиска по двоичному дереву может быть осуществлена вставка нового элемента. Пусть в массив записей, имеющий структуру дерева, изображенного на ряб, 11.7, необходимо вставить запись с ключом 12. В процессе поиска после четырех операций сравнения выясняется, что записи с таким ключом в массиве нет. Эта запись окажется включенной в структуру, если на ячейку памяти, в которой эта запись размещена, будет установлен правый указатель записи с ключом 11.
Наихудшие оценки будут получены при поиске по дереву, изображенному на рис. 11.8. В этом случае среднее число сравнений равно N/2, а максимальное число сравнений N, т.е. такой поиск аналогичен последовательному.
Структура сбалансированного двоичного дерева является наиболее гибкой структурой данных. Она обеспечивает наилучшие возможности для ведения массива (его неограниченный рост, быструю вставку и удаление записей), самые быстрые сортировку и поиск.