
- •Нелинейные структуры данных: классификация.
- •Деревья: ориентированные, упорядоченные и бинарные.
- •Представление деревьев в памяти компьютера: последовательное и связанное размещение элементов.
- •Операции над деревьями.
- •Графы и их представление в компьютере.
- •Матричное представление орграфов.
- •Связное представление орграфов.
- •Алгоритмы, оперирующие со структурами типа графа.
- •Поиск в глубину
- •Построение остова минимального веса
- •Построение эйлерова цикла
- •Поиск кратчайшего пути
- •Алгоритм поиска в ширину
- •Построение наибольшего паросочетания в двудольном графе
- •Алгоритм укладки графа на плоскости
- •Задачи поиска.
- •Исчерпывающий поиск: перебор с возвратом, метод ветвей и границ, динамическое программирование. Поиск с возвращением
- •Алгоритм поиска с возвращением
- •Метод ветвей и границ
- •Динамическое программирование
- •Быстрый поиск: бинарный и последовательный поиски в массивах, хеширование Бинарный поиск
- •Хеширование
- •Использование деревьев в задачах поиска: бинарные, случайные бинарные, оптимальные и сбалансированные деревья поиска.
- •Двоичные деревья
- •Сбалансированные двоичные деревья
- •Деревья оптимального поиска
- •Деревья цифрового поиска
- •Алгоритмы поиска на графах.
- •Внутренняя сортировка.
- •Сортировка включением
- •Обменная сортировка
- •Сортировка выбором
- •Сортировка разделением (Quicksort)
- •Сортировка с помощью дерева (Heapsort)
- •Сортировка со слиянием
- •Сравнение методов внутренней сортировки
- •Внешняя сортировка.
- •Прямое слияние
- •Естественное слияние
- •Сбалансированное многопутевое слияние
- •Многофазная сортировка
- •Улучшение эффективности внешней сортировки за счет использования основной памяти
- •Файлы: организация и обработка, представление деревьями: b-деревья. Классические b-деревья
- •Контрольные вопросы:
Структуры и алгоритмы компьютерной обработки данных
1. Нелинейные структуры данных: классификация. 2
2.Деревья: ориентированные, упорядоченные и бинарные. 4
3.Представление деревьев в памяти компьютера: последовательное и связанное размещение элементов. 8
4. Операции над деревьями. 11
5.Графы и их представление в компьютере. 13
Матричное представление орграфов. 15
Связное представление орграфов. 16
6.Алгоритмы, оперирующие со структурами типа графа. 16
Поиск в глубину 17
Построение остова минимального веса 17
Построение эйлерова цикла 17
Поиск кратчайшего пути 17
Алгоритм поиска в ширину 18
Построение наибольшего паросочетания в двудольном графе 18
Алгоритм укладки графа на плоскости 18
7.Задачи поиска. 18
8.Исчерпывающий поиск: перебор с возвратом, метод ветвей и границ, динамическое программирование. 19
Поиск с возвращением 19
Алгоритм поиска с возвращением 20
Метод ветвей и границ 21
Динамическое программирование 22
9.Быстрый поиск: бинарный и последовательный поиски в массивах, хеширование 24
Бинарный поиск 24
Хеширование 24
10.Использование деревьев в задачах поиска: бинарные, случайные бинарные, оптимальные и сбалансированные деревья поиска. 26
Двоичные деревья 27
Сбалансированные двоичные деревья 35
Деревья оптимального поиска 42
Деревья цифрового поиска 44
11.Алгоритмы поиска на графах. 45
12.Внутренняя сортировка. 46
Сортировка включением 47
Обменная сортировка 49
Сортировка выбором 50
Сортировка разделением (Quicksort) 51
Сортировка с помощью дерева (Heapsort) 52
Сортировка со слиянием 57
Сравнение методов внутренней сортировки 60
13.Внешняя сортировка. 61
Прямое слияние 61
Естественное слияние 62
Сбалансированное многопутевое слияние 63
Многофазная сортировка 65
Улучшение эффективности внешней сортировки за счет использования основной памяти 67
14.Файлы: организация и обработка, представление деревьями: B-деревья. 67
Классические B-деревья 67
B+-деревья 70
Разновидности B+-деревьев для организации индексов в базах данных 71
Контрольные вопросы: 72
Нелинейные структуры данных: классификация.
Цель описания типа данных и последующего определения некоторых переменных как относящихся к этому типу состоит в том, чтобы зафиксировать раз и навсегда размер значений, которые могут присваиваться этим переменным, и соответственно размер выделяемой для них памяти. Поэтому описанные таким образом переменные называются статическими. Однако многие задачи требуют более сложных информационных структур. Для таких задач характерно, что используемые в них структуры изменяются во время выполнения. Поэтому они называются динамическими структурами. Разумеется, на каком-то уровне детализации компоненты этих структур являются статическими, т. е. относятся к одному из фундаментальных типов данных. Эта глава посвящена конструированию и анализу динамических информационных структур, а также работе с ними.
Примечательно, что существуют некоторые близкие аналоги между методами структурирования алгоритмов и методами структурирования данных. Как и при любых аналогиях, остаются некоторые различия (иначе мы имели бы дело с идентичностью), тем не менее сравнение методов структурирования программ и данных полезно для их понимания.
Элементарным, неструктурированным оператором является присваивание. Соответствующий ему тип данных — скалярный, неструктурированный. Оба они являются атомарными строительными блоками для составных операторов и типов данных. Простейшие структуры, получаемые с помощью перечисления, или следования, — это составной оператор и запись. Оба состоят из конечного (обычно небольшого) количества явно перечисляемых компонент, которые могут различаться. Если все компоненты одинаковы, их не нужно выписывать отдельно: для того чтобы описать повторения, число которых известно и конечно, мы пользуемся оператором цикла с параметром (for) и массивом. Выбор из двух или более вариантов выражается условным или выбирающим оператором и соответственно записью с вариантами. И наконец, повторение неизвестное (потенциально, бесконечное) количество раз выражается оператором цикла с' предусловием (while) или с постусловием (repeat). Соответствующая структура данных — последовательность (файл)—простейший вид структуры, допускающей построение типов с бесконечным кардинальным числом. Характерная особенность рекурсивных структур, которая отличает их от основных структур (массивов, записей, множеств),— их способность изменять размер. Поэтому для рекурсивно определенных структур невозможно установить фиксированный размер памяти, и поэтому транслятор не может приписать компонентам такой переменной определенные адреса. Для решения этой проблемы чаще всего применяется метод динамического распределения памяти, т. е. выделения памяти для отдельных компонент в тот момент, когда они появляются во время выполнения программы, а не во время трансляции. В этом случае транслятор выделяет фиксированный объем памяти для хранения адреса динамически размещаемой компоненты, а не самой компоненты. Например, генеалогическое дерево можно представить в виде отдельных, вполне возможно, не расположенных рядом в памяти записей — по одной для каждого человека. Эти записи связываются с помощью адресов, находящихся в соответствующих полях father («отец») и mother («мать»). Графически это лучше всего изобразить стрелками
Следует подчеркнуть, что использование ссылок для реализации рекурсивных структур — чисто технический прием. Программисту необязательно знать об их существовании. Память может выделяться автоматически, как только упоминается новая переменная. Однако если использование ссылок или указателей сделать явным, то можно строить более разнообразные структуры данных, чем те, которые можно задать "лишь с помощью рекурсивных определений. В частности, в этом случае можно определять «бесконечные», или циклические, структуры. Кроме того, на одну и ту же подструктуру можно ссылаться из разных мест, т. е. относить ее к нескольким разным структурам. Поэтому в современных языках программирования принято обеспечивать явное манипулирование не только данными, но и ссылками на них. Это предполагает четкое разграничение в обозначениях данных и ссылок на них. Следовательно, нужно ввести типы данных, значениями которых являются ссылки (указатели) на другие данные.