
- •Структуры и алгоритмы обработки данных
- •Алгоритмы. Основные определения
- •От задачи к программе
- •Написание программы.
- •Типы данных, структуры данных и абстрактные типы данных
- •Указатели и курсоры
- •Время выполнения программ
- •Измерение времени выполнения программы
- •Степень (порядок) роста
- •Вычисление времени выполнения программ
- •Линейные абстрактные типы данных атд «Список»
- •Реализация списков посредством массивов
- •Реализация списков с помощью указателей
- •Атд «Стек»
- •Атд «Очередь»
- •Реализация очередей с помощью циклических массивов
- •Нелинейные абстрактные типы данных Деревья
- •Порядок узлов
- •Прямой, обратный и симметричный обходы дерева
- •Помеченные деревья и деревья выражений
- •Представление деревьев с помощью массивов
- •Специальные виды множеств атд “Дерево двоичного поиска”
- •Атд "Словарь", основанный
- •Представление ориентированных графов
- •Атд для ориентированных графов
- •Задача нахождения кратчайшего пути
- •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
Атд "Словарь", основанный
на хеш-таблицах
Словарь – множество, предназначенное для хранения "текущих" объектов с периодической вставкой или удалением некоторых из них.
Время от времени также возникает необходимость узнать, присутствует ли конкретный элемент в данном множестве.
Словарь реализуется с помощью хеш-таблицы.
Существует две формы хеширования:
-
открытое (внешнее) хеширование – позволяет хранить множества в потенциально бесконечном пространстве, снимая тем самым ограничения на размер множества
-
закрытое (внутреннее) хеширование использует ограниченное пространство для хранения данных, следовательно и размер множеств ограничен.
1. Представление словаря с помощью открытой хеш-таблицы
Таблица строится на основе следующей идеи: потенциальное множество элементов (возможно, бесконечное) разбивается на конечное число классов.
Для В классов, пронумерованных от 0 до В -1, строится хеш-функция h такая, что для любого элемента х исходного множества функция h(x) принимает целочисленное значение из интервала 0, ..., В - 1, которое, соответствует классу, которому принадлежит элемент х.
Элемент х часто называют ключом,
h(x) — хеш-значением х,
а "классы" – сегментами.
Массив, называемый таблицей сегментов и проиндексированный номерами сегментов 0, 1,...,В - 1, содержит заголовки для В связных списков. Элемент x i-го списка — это элемент исходного множества, для которого h(х) = i.
2. Представление словаря с помощью закрытой хеш-таблицы
В таблице сегментов хранятся непосредственно элементы словаря. Поэтому в каждом сегменте можно хранить только один элемент словаря.
При закрытом хешировании применяется методика повторного хеширования.
При попытке поместить элемент x в сегмент с номером h(x), который уже занят другим элементом (такая ситуация называется коллизией), выбирается другая последовательность номеров сегментов h1(x), h2(x), … , куда можно поместить элемент х. Последовательно проверяется занятость каждого из этих сегментов, пока не будет найден свободный сегмент. В него помещается элемент x. Если свободных сегментов нет, то таблица заполнена и элемент х вставить нельзя.
Для задания номеров сегментов при повторном хешировании применяются различные методы разрешения коллизий. Например, метод линейного хеширования, метод середины квадрата, метод случайного хеширования.
Пример.
Предположим, что В=8 и ключи a,b,c,d имеют хеш-значения h(a)=3, h(b)=0, h(c)=4, h(d)=3. Применим простую методику, которая называется линейным хешированием hi(x)=(h(x) + i) mod B.
Например, если мы хотим вставить элемент d, а сегмент 3 уже занят, то надо проверить на занятость сегменты 4,5,6,7,0,1,2 именно в таком порядке.
Еще одной структурой данных, которая поддерживает словари, являются АВЛ-деревья
Графы
Ориентированные и неориентированные графы – естественная модель отношений между какими-либо объектами.
О
риентированный
граф (орграф) G=(V,E) состоит из множества
вершин V и множества дуг E. Вершины также
называют узлами, а дуги – ориентированными
ребрами.
Пример орграфа с 4 вершинами 5 дугами. Вершины орграфа можно использовать для представления объектов, а дуги для отношений между объектами. Например, вершины орграфа могут представлять города, а дуги – маршруты полетов самолетов из одного города в другой.
Или, другой пример, вершины – блоки операторов программы, а дуги – перемещение потоков данных.
Путем в орграфе называется последовательность вершин v1, v2,…, vn, для которой существуют дуги v1 v2, v2 v3,…, vn-1 vn. Длина пути – количество дуг, составляющих путь.
Путь называется простым, если все вершины на нем, за исключением, может быть, первой и последней, различны.
Цикл – это простой путь длины не менее 1, который начинается и заканчивается в одной и той же вершине.
На рис. вершины 3,2,4,3 образуют цикл длины 3.
Во многих приложениях удобно к вершинам и дугам орграфа присоединить какую-либо информацию. Для этих целей используется помеченный орграф, т.е. орграф, у которого каждая дуга и/или каждая вершина имеет соответствующие метки.
Меткой может быть имя, вес, стоимость (дуги), или значение данных какого-либо заданного типа.