Информация взята из книги "Структуры данных и алгоритмы в Java"
Автор - Лафоре Роберт
- LowArrayApp
- Класс HighArrayApp
- Класс OrderedArrayApp
Алгоритм начинается с позиции 0 и выполняется по следующим правилам
- Сравнить двух игроков
- Если левый игрок выше, поменять местами
- Перейти на одну позицию вправо.
Продолжается до тех пор, пока не будет достигнут правый край шеренги 4. После того как первый отсортированный элемент окажется на своем месте, вернуться к началу массива.
Процесс продолжается до тех пор, пока все элементы не будут упорядочены.
- Количество перестановок O(N^2)
- Количество сравнений O(N^2)
- Общая сложность O(N^2)
В сортировке методом выбора вы последовательно перебираете всех игроков и выбираете(отсюда и название) самого низкорослого их них. Этот игрок меняется местами с тем, который стоит в крайней левой позиции (0). Левый игрок отсортирован, и в дальнейшем уже перемещаться не будет. Обратите внимание: в этом алгоритме отсортированные игроки собираются слева (нижние индексы), тогда как при пузырьковой сортировке они собираются справа. Следующий проход начинается с позиции 1, а обнаруженный минимальный элемент меняется местами с элементом в позиции 1. Процесс продолжается до тех пор, пока не будут отсортированы все игроки.
- Количество перестановок O(N*(N-1)/2) ;O(N^2)- в общем виде
- Количество сравнений O(N^2)
- Общая сложность O(N^2)
Сортировка выбором выполняется за время O(N^2), как и пузырьковая. Но сортировка методом выбора выполняется быстрее из-за меньшего количество перестановок. Для меньших значений N сортировка методом выбора может работать заметно быстрее. Особенно если перестановка выполняется намного медленнее сравнения.
- Обход массива слева направо, аналогично пузырьковой - сравнение соседних элементов, меняя их местами, если левое значение больше правого. В итоге наибольшее число будет перемещено в конец массива.
- Обход массива в обратном направлении (справа налево), начиная с элемента, который находится перед последним отсортированным. На этом этапе элементы также сравниваются между собой и меняются местами, чтобы наименьшее значение всегда было слева. В итоге наименьшее число будет перемещено в начало массива.
- Количество перестановок O(N*(N-1)/2); O(N^2)- в общем виде
- Количество сравнений O(N*(N-1)/2); O(N^2)- в общем виде
- Общая сложность O(N^2)
Количество операций копирования приблизительно совпадает с количеством сравнений. Однако копирование занимает меньше времени, чем перестановка, так что для случайных данных этот алгоритм работает вдвое быстрее пузырьковой сортировки и быстрее сортировки методом выбора.
Данный алгоритм работает гораздо эффективнее для данных, уже прошедших предварительную сортировку.В этом случае алгоритм выполняется за время O(N)
- Перестановка букв в слове (ReverseApp)
- Поиск парных скобок (BracketsApp)
- Реализация очереди без счетчика элементов (QueueApp)
Дек - двусторонняя очередь. И вставка, и удаление происходит с обоих концов.Соответстующие методы могут называться insertLeft()/insertRight() и removeLeft()/removeRight().
Если ограничиться методами insertLeft()/removeLeft() (или их эквивалентами для правого конца),дек работает как стек. Если же ограничиться методами insertLeft()/removeRight() (или противоположной парой), он работает как очередь.
- Реализация Приоритетной очереди (PriorityQueue)
Является более специализированной структурой данных, чем стек или очередь. Имеется начало и конец, а элементы извлекаются от начала. Но элементы упорядочиваются по ключу, так что элемент с наименьшим значением ключа всегда находится в начале ( в некоторых реализациях - в конце)
- Простой связанный список (SingleEnded)
- Вставка элемента в начале списка
- Удаление элемента в начале списка
- Перебор списка для вывода содержимого
- Двусторонние списки(DoubleEnded)
Двосторонний список похож на обычный связанный список с одной дополнительной возможностью: в нем хранится ссылка не только на первый, но и на последний элемент.
Эффективность: O(N). Но работает быстрее массива, потому что не требует перемещения элементов при вставке или удалении. Расширяем.
- Сортированные списки (-)
Данные хранятся в упорядоченном виде.
Эффективность: Вставка или удаление выполняются за O(N). Но обращение к наименьшим значениям O(1), потому что оно всегда находится в начале списка.
- Двусвязные списки (DoubleLinklist)
Позволяет перемещаться по списку как в прямом, так и в обратном направлении. Каждый элемент хранит ссылку на два других элемента вместо одного. Первая указывает на следующий элемент, а вторая на предыдущий.
- Решение задачи "Треугольные числа" (Triangle)
- Нахождение факториала числа (Factorial)
- Анаграммы (Anagram)
- Решение задачи "Ханойская башня" (TowerHanoi)
- Степени числа (NumberPower)
- Задача о рюкзаке (Knapsack)
Реализация - MergeSort
- Эффективность: Выполняется за время O(N*log(N))
Идея сортировки слиянием заключается в том, чтобы разделить массив пополам, отсортировать каждую половину, а затем слиять две половины в один отсортированный массив. Используется рекурсия - половина делится на две четверти, каждая четверть сортируется по отдельности, после чего две четверти объединяются в отсортированную половину и тд.
Реализация - ShellSort
- Эффективность: Выполняется за время O(N*(log(N))^2)
Суть сортировки Шелла состоит в том, чтобы менять местами элементы, расположенные далеко друг от друга. При использовании этого алгоритма мы делаем массив h-сортированным для большого значения h. Продолжаем уменьшать значение h, пока оно не станет равным 1. Массив называется h-сортированным, если все подмассивы каждого h-го элемента отсортированы. Алгоритм состоит из 4 шагов
- Инициализируем значение размера части (h).
- Делим массив на меньшие части с одинаковым расстоянием до h.
- Сортируем эти части с помощью сортировки вставкой.
- Повторяем шаг 1, пока список не будет отсортирован.
Алгоритм быстрой сортировки основан на механизме разбиения. Разбиением данных называется такое разделение на две группы, при котором в одну группу входят все элементы со значением ключа выше заданного порога, а в другую - все элементы со значением ключа ниже заданного порога. Реализация - Partition
Реализация - QuickSort
- Эффективность: O(N*log(N)) Алгоритм состоит из 3 основных шагов
- Массив или подмассив разбивается на две группы: левую (с меньшими ключами) и правую (с большими ключами).
- Рекурсивный вызов метода для сортировки левой группы.
- Рекурсивный вызов метода для сортировки правой группы. После разбиения все элементы левого подмассива меньше элементов правого подмассива. Если отсортировать левый подмассив и правый подмассив, то весь массив будет упорядочен. Как отсортировать эти подмассивы? Посредством рекурсивных вызовов.
Реализация - BinaryTreeImplementation (Некрасивая реализация)
- Эффективность: O(log2(N))
При вставке (или удалении) узла должны выполняться некоторые правила, которые мы будем называть красно-черными правилами. Если эти правила выполняются, дерево остается сбалансированными. Краткий перечень этих правил:
- Каждый узел окрашен в красный или черный цвет.
- Корень всегда окрашен в черный цвет.
- Если узел красный, то его потомки должны быть черными (хотя обратное не всегда истинно).
- Все пути от корня к узлу или пустому потомку должны содержать одинаковое количество черных узлов.
Реализация - Отсутствует
- Эффективность O(log2(N))
Дерево с большим количеством элементов данных и потомков называется многопутевым деревом. Цифры 2,3 и 4 в названии дерева обозначают количество связей с потомками, которые могут содержаться в заданном узле. Для не-листовых узлов возможны три конфигурации:
- Узел с одним элементом данных всегда имеет двух потомков
- Узел с тремя элементами данных всегда имеет трёх потомков.
- Узел с тремя элементами данных всегда имеет четырёх потомков.
Реализация - Отсутствует
- Эффективность O(logN)
Хеш-таблицей называется структура данных, обеспечивающая очень быструю вставку и поиск.
Реализация - Отсутствует
- Эффективность: Вставка и поиск O(1)
Если элемент данных не удается разместить в ячейке с индексом, вычисленным посредством хеш-функции, метод открытой адресации ищет в массиве другую ячейку. Мы рассмотрим три разновидности открытой адресации, различающихся способом поиска следующей свободной ячейки: линейное пробирование, квадратичное пробирование и двойное хеширование.
- Линейное пробирование Алгоритм последовательно ищет пустые ячейки.
- Квадратичное пробирование Алгоритм проверяет ячейки, находящиеся на больших расстояниях.
- Двойное хеширование Алгоритм использует повторное хеширование ключа с другой хеш-функцией и использованием результата в качестве смещения.
Пирамидой называется двоичное дерево, обладающее следующими характеристиками:
- Полнота. Все уровни дерева содержат все возможные узлы (хотя последний уровень может быть заполнен лишь частично)
- Пирамида (обычно) реализуется на базе массива.
- Для каждого узла в пирамиде выполняется основное условие, гласящее, что ключ каждого узла больше (либо равен) ключей его потомков.
Реализация - Отсутствует
- Эффективность : O(logN)
Пирамидальное дерево это полное (нет отсутствующих узлов) двоичное дерево
Алгоритм строится на вставке всех неупорядоченных элементов в пирамиду обычным методом insert(). Затем многократные вызовы remove() извлекают элементы в порядке сортировки.
- Эффективность: O(N*log(N))
Реализация - Dfs
- Посетить смежную вершину, не посещавшуюся ранее, пометить ее и занести в стек.
- Если выполнение правила 1 невозможно, извлечь вершину из стека.
- Если выполнение правил 1 и 2 невозможно, обход закончен.
Реализация - Bfs
- Посетить следующую вершину, не посещавшуюся ранее, смежную с текущей вершиной, пометить ее и занести в очередь.
- Если выполнение правила 1 невозможно, извлечь вершину из очереди и сделать ее текущей вершиной.
- Если выполнение правил 1 и 2 невозможно, обход завершен.
Граф с минимальным количеством ребер, необходимых для соединений вершин. Реализация - Mst
Если каждое ребро графа обладает направлением, то данный граф является направленным.
Реализация - Отсутствует Алгоритм топологической сортировки создает список вершин. Упорядоченных таким образом, что при наличии пути от А к B вершина А предшествует B в списке.
Выполняется только с направленными ациклическими графами!
Ациклические графы - направленные и не содержащие циклы.
- Найти вершину, не имеющую преемников.
- Удалить эту вершину из графа и вставить ее метку в начало списка.
Алгоритм Уоршелла - алгоритм преобразования матрицы смежности в транзитивное замыкание графа.
Взвешенный граф - граф с характеристикой ребер (Вес)
Ключевые моменты
- Каждый раз при отправке агента в новый город вы используете информацию, полученную от него, для обновления списка стоимости проезда. В списке сохраняется только самый экономичный маршрут (из известных вам) от начальной точки до заданного города.
- Новый агент всегда отправляется в город с самым экономичным маршрутом от начальной точки(а не с самым дешевым сегментом от любого города, в котором уже есть агент, как при построении минимального остовного дерева)