
- •Оглавление
- •Список рисунков
- •ВвЕдение
- •Необходимые понятия и определения
- •Основные структуры данных
- •Задача сортировки массивов
- •Трудоемкость методов сортировки массивов
- •Задача сортировки последовательностей
- •Теорема о сложности сортировки
- •Задача поиска элементов с заданным ключом
- •Методы сортировки с квадратичной трудоемкостью
- •Метод прямого выбора
- •Алгоритм на псевдокоде
- •Пузырьковая сортировка
- •Алгоритм на псевдокоде
- •Шейкерная сортировка
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Метод Шелла
- •Метод прямого включения
- •Алгоритм на псевдокоде
- •Метод Шелла
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Быстрые методы сортировки массивов
- •Пирамидальная сортировка
- •Свойства пирамиды
- •Алгоритм на псевдокоде
- •Построение (1, 8)-пирамиды
- •Сортировка
- •Алгоритм на псевдокоде
- •Метод Хоара
- •Алгоритм на псевдокоде
- •Проблема глубины рекурсии.
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Работа с линейными списками
- •Указатели. Основные операции с указателями
- •Основные операции с линейными списками
- •Методы сортировки последовательностей
- •Метод прямого слияния
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Цифровая сортировка
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Двоичный поиск в упорядоченном массиве
- •Алгоритм двоичного поиска
- •Алгоритм на псевдокоде
- •Обозначим
- •Найден – логическая переменная, в которой будем отмечать факт успешного завершения поиска.
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Сортировка данных с произвольной структурой
- •Сравнение данных произвольной структуры
- •Сортировка по множеству ключей. Индексация
- •Алгоритм на псевдокоде (на примере пузырьковой сортировки)
- •Индексация через массив указателей
- •Варианты заданий
- •Двоичные деревья
- •Основные определения и понятия
- •Различные обходы двоичных деревьев
- •Варианты заданий
- •Деревья поиска
- •Поиск в дереве
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Идеально сбалансированное дерево поиска
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Случайное дерево поиска
- •Определение случайного дерева поиска
- •Добавление вершины в дерево
- •Алгоритм на псевдокоде
- •Удаление вершины из дерева
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Сбалансированные по высоте деревья (авл-деревья)
- •Определение и свойства авл-дерева
- •Повороты при балансировке
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Добавление вершины в дерево
- •Алгоритм на псевдокоде
- •Удаление вершины из дерева
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Определение б-дерева порядка m
- •Поиск в б-дереве
- •Алгоритм на псевдокоде
- •Построение б-дерева
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Определение двоичного б-дерева
- •Добавление вершины в дерево
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Деревья оптимального поиска (доп)
- •Определение дерева оптимального поиска
- •Точный алгоритм построения доп
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Хэширование и поиск
- •Понятие хэш-функции
- •Алгоритм на псевдокоде
- •Метод прямого связывания
- •Метод открытой адресации
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Элементы теории кодирования информации
- •Необходимые понятия
- •Кодирование целых чисел
- •Алфавитное кодирование
- •Оптимальное алфавитное кодирование
- •Алгоритм на псевдокоде
- •Почти оптимальное алфавитное кодирование
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •Варианты заданий
- •Рекомендуемая литература
- •Псевдокод для записи алгоритмов
- •Структуры и алгоритмы обработки данных
- •630102, Г. Новосибирск, ул. Кирова, 86.
Алгоритм на псевдокоде
Поиск элемента с ключом X
L: = 1, R: =n
DO (L<R)
m: =
IF (am < X) L: = m+1
ELSE R: = m
FI
OD
IF (ar=X) Найден: =да
ELSE Найден: =нет
FI
Нетрудно заметить, что после выхода из цикла L = R. Если в массиве несколько элементов с одинаковым ключом, то эта версия алгоритма находит самый левый из них. Для поиска остальных элементов с заданным ключом требуется просмотреть массив только в одном направлении – вправо от найденного элемента.
Дадим верхнюю оценку трудоёмкости
алгоритма двоичного поиска. На каждой
итерации поиска необходимо два сравнение
для первой версии, одно сравнение для
второй версии. Количество итераций не
больше, чем
.
Таким образом, трудоёмкость двоичного
поиска в обоих случаях
С=O(log n), n → ∞.
Варианты заданий
Написать программу (язык программирования Паскаль или Си) для быстрого поиска в упорядоченном массиве.
Сравнить средние трудоемкости различных версий быстрого поиска.
Построить графики зависимости средней трудоемкости поиска от количества элементов в массиве для различных вариантов поиска.
Сравнить трудоемкость быстрого поиска с трудоемкостью поиска перебором.
Экспериментально оценить долю случаев, когда поиск перебором происходит быстрее, чем быстрый поиск.
Сортировка данных с произвольной структурой
Сравнение данных произвольной структуры
Основная проблема, возникающая при сортировке данных произвольной структуры неопределенность операции сравнения. Если исходный массив А заполнен числами, то в качестве операции сравнения могут быть использованы стандартные операции сравнения. Если структура сортируемых данных не соответствует простым встроенным типам языка, то необходимо переопределить операции сравнения с помощью логических функций. Например, пусть массив А телефонный справочник, каждый элемент которого является записью с полями Name (фамилия абонента) и Phone (номер телефона):
A
: Иванов Петров …. Егоров
223455 452185 454455
Рисунок 26 Список абонентов
Если необходимо отсортировать телефонный справочник по фамилиям абонентов, то логическая функция Less (меньше) может выглядеть следующим образом:
function less ( x,y: <тип записи>): boolean;
begin
less:=x.Name <y.Name;
end;
Такой подход позволяет путем изменения функции Less учитывать любые сложные условия упорядочивания массива элементов произвольной структуры. Например, если необходимо упорядочить телефонный справочник по номерам телефонов дополнительно по фамилиям абонентов, то функцию Less можно записать так:
function less ( x,y: <тип записи>): boolean;
begin
IF (x.phone<y.phone)
less:=true
ELSEIF (x.phone>y.phone )
less:=false
ELSE less:=(x.name<y.name)
FI
FI
end;
Кроме того, нужно переопределить операцию сравнения и при организации поиска элементов в отсортированном массиве. Изменение направления упорядочивания массива достигается путем замены операций сравнения на противоположные, т. е. в самой функции меняем «<» на «>».Операция пересылки не требует переопределения и выполняется путем побитового копирования.