- •2. Структуры данных. Элементарные данные.
- •3. Линейные структуры данных. Массив.
- •4. Линейные структуры данных. Запись.
- •5. Линейные структуры данных. Множество.
- •6. Линейный однонаправленный список. Способы реализации и основные операции.
- •7. Линейный двунаправленный список. Способы реализации и основные операции.
- •8. Циклический однонаправленный список. Способы реализации и основные операции.
- •9. Циклический двунаправленный список. Способы реализации и основные операции.
- •10. Стек. Способы реализации и основные операции.
- •11. Очередь. Способы реализации и основные операции.
- •12. Дек. Способы реализации и основные операции.
- •13. Мультисписки. Способы реализации и основные операции.
- •14. Слоёные списки. Способы реализации и основные операции.
- •15. Графы. Способы реализации и основные операции.
- •16. Общие сведения о деревьях. Двоичные деревья. Основные определения и способы реализации.
- •17. Обходы деревьев.
- •18. Организация файлов. Общие сведения.
- •21. Методы разработки алгоритмов
- •22. Алгоритмы поиска в линейных структурах. Последовательный (линейный) поиск
- •23. Алгоритмы поиска в линейных структурах. Бинарный поиск
- •24. Хеширование данных. Функция хеширования
- •25. Хеширование данных. Открытое хеширование
- •26. Хеширование данных. Закрытое хеширование
- •27. Поиск данных по вторичным ключам
- •28. Упорядоченные деревья поиска. Способы реализации и основные операции
- •29. Случайные деревья поиска и оптимальные деревья поиска. Основные понятия
- •31. Поиск в тексте. Прямой поиск
- •32. Поиск в тексте. Алгоритм Кнута, Мориса и Пратта
- •33. Поиск в тексте. Алгоритм Боуера и Мура
- •34. Общие сведения об алгоритмах кодирования (сжатия) данных. Метод Хаффмана
- •35. Алгоритм внутренней сортировки подсчетом
- •36. Алгоритм внутренней сортировки простым включением
- •37. Алгоритм внутренней сортировки простым извлечением
- •38. Алгоритм внутренней сортировки методом пузырька
- •39. Алгоритм внутренней быстрой сортировки (Хоара)
- •40. Алгоритм внутренней сортировки слиянием
- •41. Алгоритм внутренней сортировки распределением
- •42. Алгоритмы внешней сортировки
- •43. Алгоритм определения циклов в графе
- •45. Алгоритмы обхода графа. Поиск в ширину (Волновой алгоритм)
- •46. Алгоритмы нахождения кратчайшего пути в графе. Алгоритм Дейкстры
- •47. Алгоритмы нахождения кратчайшего пути в графе. Алгоритм Флойда
- •49. Алгоритмы нахождения минимального остовного дерева графа. Алгоритм Крускала
42. Алгоритмы внешней сортировки
Как уже говорилось выше, внешняя сортировка - это упорядочивание данных, которые хранятся на внешнем устройстве с медленным доступом (диск, лента и т. д.), и прежде всего надо уменьшить число обращений к этому устройству, т. е. число проходов через файл. Обычно данные, хранящиеся на внешних устройствах, имеют большой обьем, что не позволяет их целиком переместить в оперативную память, отсортировать с использованием одного из алгоритмов внутренней сортировки, а затем вернуть их на внешнее устройство. В этом случае осуществлялось бы минимальное количество проходов через файл: однократное чтение и однократная запись данных. Однако на практике приходится осуществлять чтение, обработку и запись данных в файл по блокам, размер которых зависит от операционной системы и имеющегося обьема оперативной памяти, что приводит к увеличению числа проходов через файл и заметному снижению скорости сортировки. Применение большинства алгоритмов внутренней сортировки для сортировки файлов требует порядка О(л) проходов. Однако, если несколько модифицировать алгоритм сортировки слиянием (см. п. 2.5.2.8), то можно произвести сортировку, осуществляя порядка O(log л) проходов. Основное отличие сортировки слиянием для файлов, заключается в следующем. Вся сортируемая последовательность данных разбивается на два файла f, и fz. Желательно, чтобы количество записей в этих файлах было поровну. Как и в алгоритме внутренней сортировки, считаем, что любой файл состоит из участков длиной 1. Затем можно oR åäè- нить участки длины 1 и распределить их по файлам g, и g, в виде участков длины 2. После этого делаем и пустыми и объединяем g> и я в/ и f~ которые затем можно организовать в виде участков длины 4 ит. д. После выполнения ~ подобного рода проходов получатся два файла, состоящие из участков длины 2'. Если 2' «> и, тогда один из этих двух файлов будет пустым, а другой будет содержать единственный участок длиной и, т. е. будет отсортирован. Так как 2' «> n при ~ > log и, то нетрудно заметить, что в этом случае будет достаточно порядка O(log n) проходов по данным.
43. Алгоритм определения циклов в графе
Наличие циклов в графе можно определить с помощью эффективного и простого алгоритма. Алгоритм может быть реализован как для матричного, так и для спискового способа представления графа. В случае неориентированного графа его ребра считаются двунаправленными. Принцип выделения циклов следующий. Если вершина имеет только входные или только выходные дуги, то она явно не входит ни в один цикл. Можно удалить все такие вершины из графа вместе со связанными с ними дугами. В результате появятся новые вершины, имеющие только входные или только выходные дуги. Они также удаляются. Итерации повторяются до тех пор, пока граф не перестанет изменяться. Отсутствие изменений свидетельствует об отсутствии циклов, если все вершины были удалены. Все оставшиеся вершины обязательно принадлежат циклам (рис. 60). Достоинством данного алгоритма является то, что происходит одновременное определение цикличности или ацикличности графа и исключение дуг, не входящих в циклы. После завершения алгоритма остается матрица смежности, соответствующая подграфу, содержащему все циклы исходного графа. 44. Алгоритмы обхода графа. Поиск в глубину Поиск в глубину является обобщением метода обхода дерева в прямом порядке (см. 1.3.4.2). Предположим, что есть ориентированный граф G, в котором первоначально все вершины помечены как не посещённые. Поиск в глубину начинается с выбора начальной вершины v графа G, и эта вершина помечается как посещенная. Затем для каждой вершины, смежной с вершиной v и которая не посещалась ранее, рекурсивно применяется поиск в глубину. Когда все вершины, которые можно достичь из вершины v, будут «удостоены» посещения, поиск заканчивается. Если некоторые вершины остались не посещенными, то выбирается одна из них и поиск повторяется. Этот процесс продолжается до тех пор, пока обходом не будут охвачены все вершины орграфа G. Эгот метод обхода вершин орграфа называется поиском в глубину, поскольку поиск не посещённых вершин идет в направлении вперед (вглубь) до тех пор, пока это возможно. Например, пусть х - последняя посещенная вершина. Для продолжения процесса выбирается какая-либо нерассмотренная дуга х ~у, выходящая из вершины х. Если вершина у уже посещалась, то ищется другая вершина, смежная с вершиной х. Если вершина у ранее не посещалась, то она помечается как посещенная и поиск начинается заново от вершины у. Про~я все пути, которые начинаются в вершине у, возвращаемся в вершину х, т. е. в ту вершину, из которой впервые была достигнута вершина у. Затем продолжается выбор нерассмотренных дуг, исходящих из вершины х, и так до тех пор, пока не будут исчерпаны все эти дуги (рис. 51).
