Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Primery_lectiy.doc
Скачиваний:
141
Добавлен:
20.06.2014
Размер:
722.43 Кб
Скачать

Структуры и алгоритмы компьютерной обработки данных

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

  1. Нелинейные структуры данных: классификация.

Цель описания типа данных и последующего опре­деления некоторых переменных как относящихся к этому типу состоит в том, чтобы зафиксировать раз и навсегда размер значений, которые могут присваиваться этим перемен­ным, и соответственно размер выделяемой для них памяти. Поэтому описанные таким образом переменные называются статическими. Однако многие задачи требуют более слож­ных информационных структур. Для таких задач характерно, что используемые в них структуры изменяются во время вы­полнения. Поэтому они называются динамическими струк­турами. Разумеется, на каком-то уровне детализации компо­ненты этих структур являются статическими, т. е. относятся к одному из фундаментальных типов данных. Эта глава посвящена конструированию и анализу динамических инфор­мационных структур, а также работе с ними.

Примечательно, что существуют некоторые близкие ана­логи между методами структурирования алгоритмов и мето­дами структурирования данных. Как и при любых аналогиях, остаются некоторые различия (иначе мы имели бы дело с идентичностью), тем не менее сравнение методов структу­рирования программ и данных полезно для их понимания.

Элементарным, неструктурированным оператором яв­ляется присваивание. Соответствующий ему тип данных — ска­лярный, неструктурированный. Оба они являются атомар­ными строительными блоками для составных операторов и типов данных. Простейшие структуры, получаемые с по­мощью перечисления, или следования, — это составной опе­ратор и запись. Оба состоят из конечного (обычно неболь­шого) количества явно перечисляемых компонент, которые могут различаться. Если все компоненты одинаковы, их не нужно выписывать отдельно: для того чтобы описать повто­рения, число которых известно и конечно, мы пользуемся оператором цикла с параметром (for) и массивом. Выбор из двух или более вариантов выражается условным или выби­рающим оператором и соответственно записью с вариантами. И наконец, повторение неизвестное (потенциально, бесконеч­ное) количество раз выражается оператором цикла с' пред­условием (while) или с постусловием (repeat). Соответствую­щая структура данных — последовательность (файл)—про­стейший вид структуры, допускающей построение типов с бесконечным кардинальным числом. Характерная особенность рекурсивных структур, которая отличает их от основных структур (массивов, записей, мно­жеств),— их способность изменять размер. Поэтому для ре­курсивно определенных структур невозможно установить фиксированный размер памяти, и поэтому транслятор не может приписать компонентам такой переменной определен­ные адреса. Для решения этой проблемы чаще всего приме­няется метод динамического распределения памяти, т. е. вы­деления памяти для отдельных компонент в тот момент, когда они появляются во время выполнения программы, а не во время трансляции. В этом случае транслятор выделяет фик­сированный объем памяти для хранения адреса динамически размещаемой компоненты, а не самой компоненты. Напри­мер, генеалогическое дерево можно представить в виде отдельных, вполне возможно, не распо­ложенных рядом в памяти записей — по одной для каждого человека. Эти записи связываются с помощью адресов, нахо­дящихся в соответствующих полях father («отец») и mother («мать»). Графически это лучше всего изобразить стрелками

Следует подчеркнуть, что использование ссылок для реа­лизации рекурсивных структур — чисто технический прием. Программисту необязательно знать об их существовании. Па­мять может выделяться автоматически, как только упоми­нается новая переменная. Однако если использование ссылок или указателей сделать явным, то можно строить более разнообразные структуры данных, чем те, которые можно задать "лишь с помощью рекурсивных определений. В част­ности, в этом случае можно определять «бесконечные», или циклические, структуры. Кроме того, на одну и ту же под­структуру можно ссылаться из разных мест, т. е. относить ее к нескольким разным структурам. Поэтому в современных языках программирования принято обеспечивать явное манипулирование не только данными, но и ссылками на них. Это предполагает четкое разграничение в обозначениях дан­ных и ссылок на них. Следовательно, нужно ввести типы данных, значениями которых являются ссылки (указатели) на другие данные.

Соседние файлы в папке Лекции