- •1. Инструментальные средства разработки программного обеспечения сапр
- •2. Абстрактные типы данных. Примеры и варианты реализации.
- •3. Прямые методы сортировки массивов
- •4. Быстрая сортировка
- •5. Сортировка Шелла
- •6. Пирамидальная сортировка.
- •7. Алгоритмы внешней сортировки (вс)
- •8. Бинарный поиск и поиск по бинарному дереву
- •9. Алгоритмы обхода бинарных деревьев и их применение в трансляции программ и обработке данных
- •10. Машинное представление деревьев.
- •11. Машинное представление графов
- •12. Процедура поиска в глубину и ее применение в задачах обработки данных
- •13. Формальные грамматики и языки. Классификация грамматик.
- •14. Синтаксические диаграммы
- •15. Фазы трансляции программ и варианты организации языковых процессоров
- •16. Лексический анализ программ. Организация работы сканера
- •17. Нисходящий грамматический разбор с возвратом.
- •18 Восходящий грамматический разбор программ.
- •19 Формы внутреннего представления программ в языковых процессорах сапр.
- •2. Польская запись.
- •20 Семантический анализ. Примеры организации семантических программ.
- •21. Машинно-независимая оптимизация программ
- •22 . Генерация кода в языковых процессорах сапр (Генерация кода в компиляторах)
- •23 Машинно-зависимая оптимизация программ
- •24 Организация информационных таблиц транслятора с хеш-адресацией
- •25 Методы разрешения коллизий в информационных таблицах с хэш-адресацией
- •Метод повторного хеширования (рехеширование)
- •Линейное рехеширование
- •Случайное рехеширование
- •Квадратичное рехеширование
- •Рехеширование – сложение
- •Метод цепочек
8. Бинарный поиск и поиск по бинарному дереву
Поиск в массиве записей может быть выполнен значительно быстрее, если они предварительно отсортированы по возрастанию или убыванию ключей, которые используются для поиска. Пусть исходный массив записей a1,a2,…,an отсортирован таким образом, что значения ключей: f(a1) < f(a2) < … < f(an). Тогда бинарный поиск выполняется следующим образом: Пусть k – аргумент поиска, тогда:
На первом шаге вычисляется индекс среднего элемента р=n/2. Если значение p получается не целым, то оно может округляться в любую сторону (но всегда в одну).
Если k = f(ap), то – конец алгоритма. Результатом будет индекс элемента p этого массива.
Если это условие не выполняется, то проверяется следующее условие: k < f(ap). При его выполнении поиск должен быть продолжен в левой половине массива, т.е. среди элементов: a1,a2,…,ap-1. В противном случае, т.е. при k > f(ap), поиск должен быть продолжен в другой половине, т.е.: ap+1,ap+2,…,an.
В выбранной половине опять определяется средний элемент, и процедура повторяется до тех пор, пока не встретится запись с заданным ключом или пока не останется один не просмотренный элемент. Если этот элемент имеет ключ k, то процесс завершился успешно, если нет, то запись с заданным ключом отсутствует.
По сравнению с линейным поиском считается, что бинарный поиск становится более эффективным, когда n > 20.
Основным недостатком бинарного поиска - необходимость хранения записей в отсортированном виде, что практически невозможно при частых вставках и удалениях элементов в списке.
Реализация:
1) Итерационный вариант: k – аргумент поиска
a[1..n] – массив ключей, в которых производится поиск
L, h – переменные, индексы верхней и нижней границы зоны поиска
BS = 0 – запись с заданным ключом отсутствует, в противном случае BS = i – индекс элемента
2) Рекурсивный вариант.
В рекурсивном варианте будем считать, что алгоритм бинарного поиска реализуется функцией BS (k, L, h), k – аргумент поиска, h, L – верхняя и нижняя границы поиска.
Поиск по бинарному дереву:
Использование бинарного дерева для организации записей таблицы позволяет сохранить эффективность на уровне бинарного поиска, обеспечивая при этом достаточно простую реализацию вставки и удаления записи.
Для выполнения поиска бинарное дерево строится следующим образом (предполагается, что никакие две записи не имеют одинаковых ключей): считывается последовательность записей таблицы, каждая из которых поочередно сопоставляется с вершиной дерева.
Первую запись входной последовательности сопоставляют с корнем дерева.
Для каждой следующей записи ключ сначала сравнивается с ключом корня. Если он меньше, чем ключ корня, то далее сравнивается с ключом левого потомка; если больше, то с ключом правого. Если потомок для сравнения отсутствует, то формируется новая вершина дерева, с которой сопоставляется очередная запись.
Шаг 2 повторяется до тех пор, пока не будет просмотрена вся входная последовательность записей.
Поиск записи с заданным ключом осуществляется в точности по рассматриваемой процедуре.
Сложность алгоритма поиска по дереву определяется высотой дерева и колеблется в пределах от O(Log2n) до O(n).
