- •А. С. Третьяков алгоритмы
- •Структуры данных Оглавление
- •2.1 Введение 20
- •4.1 Введение 69
- •5.1 Введение 87
- •Предисловие
- •Раздел I структуры данных
- •Глава 1. Массивы
- •1.1 Введение
- •1.2.1 Метод деления
- •1.2.2 Метод умножения
- •1.3.1 Открытое хеширование
- •1.3.2 Закрытое хеширование
- •1.4 Ассоциативный массив
- •1.5 Динамический массив
- •Глава 2. Списки
- •2.1 Введение
- •2.2 Связный список
- •2.3 Стек
- •2.4 Очередь
- •2.4.1 Реализация очереди с помощью массива
- •2.4.2 Реализация очереди с помощью указателей
- •Глава 3. Графы
- •3.1 Основные понятия и виды графов
- •3.2 Матрица смежности
- •3.3 Список смежности
- •3.4 Список ребер
- •3.5 Матрица инцидентности
- •Глава 4. Деревья
- •4.1 Введение
- •4.2 Двоичное дерево
- •4.3 Двоичное дерево поиска
- •4.4 Куча
- •4.5.1 Балансировка
- •4.5.2 Добавление узлов
- •4.5.3 Удаление узлов
- •Раздел II алгоритмы
- •Глава 5. Анализ сложности алгоритмов
- •5.1 Введение
- •5.2 Асимптотический анализ
- •Глава 6. Сортировка
- •6.1 Сортировка пузырьком
- •6.2 Сортировка выбором
- •6.3 Сортировка вставками
- •6.4 Сортировка Шелла
- •6.5 Быстрая сортировка
- •6.5.1 Разбиение массива
- •6.5.2 Рекурсивная сортировка частей массива
- •6.6 Сортировка слиянием
- •6.7 Гномья сортировка
- •6.8 Шейкерная сортировка
- •Глава 7. Поиск
- •7.1 Линейный поиск
- •7.2 Двоичный поиск
- •7.3 Интерполяционный поиск
- •Глава 8. Теория чисел
- •8.1 Алгоритм Евклида
- •8.1.1 Метод вычитания
- •8.1.2 Метод деления
- •8.2 Бинарный алгоритм вычисления нод
- •8.3 Быстрое возведение в степень
- •8.4 Решето Эратосфена
- •8.5 Решето Сундарама
- •Глава. 9 Графы
- •9.1 Поиск в ширину
- •9.2 Поиск в глубину
- •9.3 Алгоритм Дейкстры
- •9.4 Алгоритм Флойда – Уоршелла
- •9.5 Алгоритм Беллмана — Форда
Предисловие
Данная книга собрана по материалам сайта Kvodo.ru, которые были отредактированы и несколько обобщены. В ней кратко описаны алгоритмы и структуры данных, наиболее часто используемые в программировании, а также конкретные способы их реализации на двух популярных языках программирования: С++ и Pascal. Книга рассчитана на читателя с некоторым базовым набором знаний. Она не претендует называться учебником, и тем более заменить общепризнанный учебный материал.
Изучать главы книги необязательно по порядку. В этом плане она может служить справочником. Большинство тем содержат рисунки, схемы и таблицы, поясняющие работу алгоритмов и структур данных.
В отличие от первоначальной версии (материала сайта), в коде отсутствуют некоторые элементы, необходимые для реального функционирования программы. Сделано это с целью «оторвать» приведенный код от конкретной среды разработки. Читателю придется самому добавлять необходимые директивы и операторы.
В разделе «Алгоритмы» каждая тема подкреплена листингом, написанном как на C++, так и на Pascal. Но в разделе «Структуры данных», в подавляющем большинстве случаев, приведен код только для C++, т. к. некоторые темы требовали значительного обилия кода, что не позволило использовать сразу два языка. Поэтому предполагается, что читатель знаком с языком C++. Изучить его можно, воспользовавшись соответствующей книгой или сетевым ресурсом, например, тем же Kvodo.ru.
Книга, с большой вероятностью, содержит ошибки. Мы будем благодарны, если Вы укажите их, воспользовавшись электронной почтой: Kvodo.ru@inbox.ru
Выражаем благодарность всем тем читателям, что давали полезные советы и находили ошибки.
Раздел I структуры данных
Введение
Необходимым условием хранения информации в памяти компьютера является возможность преобразования этой самой информации в подходящую для компьютера форму. В том случае, если это условие выполнимо, следует определить структуру, пригодную именно для наличествующей информации, ту, которая предоставит требующийся набор возможностей работы с ней. Здесь под структурой понимается способ представления информации, посредством которого совокупность отдельно взятых элементов образует нечто единое, обусловленное их взаимосвязью друг с другом. Скомпонованные по каким-либо правилам и логически связанные межу собой данные могут весьма эффективно обрабатываться, так как общая для них структура предоставляет набор возможностей для работы с ними – одно из того за счет чего достигаются высокие результаты в решениях тех или иных задач.
Говоря о не вычислительной технике, можно показать ни один случай, где у информации видна явная структура. Наглядным примером служат книги самого разного содержания. Они разбиты на страницы, параграфы и главы, имеют, как правило, оглавление, то есть интерфейс пользования ими. В широком смысле, структурой обладает всякое живое существо, без нее органика навряд-ли смогла бы существовать.
Вполне вероятно, читателю приходилось сталкиваться со структурами данных непосредственно в информатике, например, с теми, что встроены в язык программирования. Часто они именуются типами данных. К таковым относятся: массивы, числа, строки, файлы и т. д.
Методы хранения информации, называемые «простыми», т. е. неделимыми на составные части, предпочтительнее изучать вместе с конкретным языком программирования, либо же глубоко углубляться в суть их работы. Поэтому здесь будут рассмотрены лишь «интегрированные» структуры, те которые состоят из простых, а именно: массивы, списки, деревья и графы.
