- •Структуры и алгоритмы обработки данных
- •Алгоритмы. Основные определения
- •От задачи к программе
- •Написание программы.
- •Типы данных, структуры данных и абстрактные типы данных
- •Указатели и курсоры
- •Время выполнения программ
- •Измерение времени выполнения программы
- •Степень (порядок) роста
- •Вычисление времени выполнения программ
- •Линейные абстрактные типы данных атд «Список»
- •Реализация списков посредством массивов
- •Реализация списков с помощью указателей
- •Атд «Стек»
- •Атд «Очередь»
- •Реализация очередей с помощью циклических массивов
- •Нелинейные абстрактные типы данных Деревья
- •Порядок узлов
- •Прямой, обратный и симметричный обходы дерева
- •Помеченные деревья и деревья выражений
- •Представление деревьев с помощью массивов
- •Специальные виды множеств атд “Дерево двоичного поиска”
- •Атд "Словарь", основанный
- •Представление ориентированных графов
- •Атд для ориентированных графов
- •Задача нахождения кратчайшего пути
- •Int **c, // массив стоимостей
- •Int *d) // массив кратчайших
- •Остовные деревья минимальной стоимости
- •Обход графов
- •Поиск в ширину
- •Поиск в глубину
- •Сортировка
- •Простые схемы сортировки Метод «пузырька»
- •Сортировка вставками
- •Быстрая сортировка
- •Пирамидальная сортировка
- •«Карманная» сортировка
- •Порядковые статистики
- •Методы разработки алгоритмов. Типы алгоритмов
- •Алгоритмы «разделяй и властвуй» (метод декомпозиции)
- •Баланс подзадач
- •Динамическое программирование
- •Перемножение нескольких матриц
- •Шаг 1: строение оптимальной расстановки скобок
- •Шаг 2: рекуррентное соотношение
- •Шаг 3: вычисление оптимальной стоимости
- •Void MatrixChainOrder(int n, // кол-во матриц
- •Int p[], // размеры матриц
- •Int **s) // оптимальное k
- •Шаг 4: построение оптимального решения
- •Int **s, // таблица, полученная
- •Int I, // индексы
- •Когда применимо динамическое программирование?
- •Оптимальность для подзадач
- •Перекрывающиеся подзадачи
- •«Жадные» алгоритмы
- •"Жадные" алгоритмы как эвристики
- •Когда применим жадный алгоритм?
- •Принцип жадного выбора
- •Оптимальность для подзадач
- •Поиск с возвратом
- •Функции выигрыша
- •Метод ветвей и границ
- •Структуры данных и алгоритмы для внешней памяти
- •Внешняя сортировка
- •Хранение данных в файлах
- •Простая организация данных
- •Хешированные файлы
- •Индексированные файлы
- •Содержание
- •Глава I. Линейные абстрактные типы данных 31
- •Глава II. Сортировка 108
Индексированные файлы
Еще одним распространенным способом организации файла записей является поддержание файла в отсортированном (по значениям ключей) порядке. В этом случае файл можно было бы просматривать как обычный словарь или телефонный справочник, когда мы просматриваем лишь заглавные слова или фамилии на каждой странице. Чтобы облегчить процедуру поиска, можно создать второй файл, называемый разреженным индексом, который состоит из пар (x ,b), где x – значение ключа, а b – физический адрес блока, в котором значение ключа первой записи равняется x. Этот разреженный индекс отсортирован по значениям ключей.
Линейный поиск годится лишь для небольших индексных файлов. Более эффективным методом является двоичный поиск. Допустим, что индексный файл хранится в блоках b1,b2,…,b(n/2)-1.Если x>=y , но x меньше, чем ключ блока b(n/2)-1, используется линейный поиск, чтобы проверить, совпадает ли x с первым компонентом индексной пары в блоке b(n/2). В противном случае повторяется поиск в блоках b(n/2)+1, b(n/2)+2,…, b(n). При использовании двоичного поиска нужно проверить лишь [Log2(n+1)] блоков индексного файла.
B-деревья
B-дерево – это особый вид сбалансированного m-арного дерева , который позволяет нам выполнять операции поиска, вставки и удаления записей из внешнего файла с гарантированной производительностью для самой неблагоприятной ситуации. Оно представляет собой обобщений 2-3 дерева. С формальной точки зрения B-дерево порядка m представляет собой m-арное дерево поиска, характеризующееся следующими свойствами.
-
Корень либо является листом, либо имеет по крайней мере двух сыновей.
-
Каждый узел, за исключением корня и листьев, имеет от [m/2] до m сыновей.
-
Все пути от корня до любого листа имеют одинаковую длину.
Обратитие внимание: каждое 2-3 дерево является B-деревом порядка 3, т.е.3-арным. На рис показано B-дерево порядка 5 , здесь предполагается, что в блоке листа умещается не более трех записей.
B-дерево можно рассматривать как иерархический индекс, каждый узел в котором занимает блок во внешней памяти. Корень B-дерева является индексом первого уровня. Каждый нелистовой узел на B-дереве имеет форму(p0,k1,p1,k2,…,kn,pn), где p(i) является указателем i-того сына,0 i n, а k1 ключ,1 i n. Ключи в узле упорядочены, поэтому k1<k2<…<kn. Все ключи в поддереве, на которое указывает p0, меньше, чем k1. В случае 1 i < n все ключи в поддереве, на которое указывает p1, имеют значения, не меньшие, чем k(i), и меньшие, чем k(i+1). Все ключи в поддереве, на которое указывает p(n), имеют значения, не меньшие, чем k(n).
Существуют несколько способов организации листьев. В данном случае мы предполагаем, что записи основного файла хранятся только в листьях. Предполагается также, что каждый лист занимает один блок.
Содержание
Алгоритмы. Основные определения 3
1. От задачи к программе 3
Типы данных, структуры данных 7
и абстрактные типы данных 7
Время выполнения программ 13
Глава I. Линейные абстрактные типы данных 31
АТД «Список» 31
АТД «Стек» 46
АТД «Очередь» 48
2. АТД «Дек» 53
НЕЛИНЕЙНЫЕ абстрактные типы данных 54
Деревья 54
Коды Хаффмана 69
Специальные виды множеств 73
Графы 83
Задача нахождения кратчайшего пути 91
Остовные деревья минимальной стоимости 94
3. Обход графов 98