- Общее:
- Алгоритмическая сложность: как определить сложность алгоритма
- Константная O(1)
- Логарифмическая О(log n)
- Линейное O(n)
- Линейно-логарифмическое (O(n log(n)))
- Квадратическая (O(n2))
- Если алгоритм имеет сложность _ тогда его эффективность _
- (о малое) o(n) - < n
- (О большое) O(n) - <= n
- (Тета) Θ(n) - = n
- (Омега большое) Ω(n) - >= n
- (Омега малое) ω(n) - > n
- Алгоритмическая сложность: как определить сложность алгоритма
- Структуры данных: https://proglib.io/p/data-structures
- Общее про деревья:
- Высота дерева -
- Список:
- Очередь:
- Множество:
- Map:
- Хэш-таблица:
- Стэк:
- Стэк область память выделяемая в полном объеме, при создании процесса (программы). Работает в порядке LIFO (Last In, First Out).
- Куча:
- Для выделения память из кучи происходит обращение к ОС
- Двоичная куча: Это двоичное дерево, обладающее дополнительными свойствами
- Значение любого узла не меньше (или не больше), чем значения у его потомков.
- Глубина всех узлов отличается не более, чем на 1 уровень.
- Последний слой заполняется слева направо без пропусков.
- Двоичное дерево поиска: Это двоичное дерево, обладающее дополнительными свойствами
- У всех узлов левого поддерева узла Х, значения меньше, чем у узла Х.
- У всех узлов правого поддерева узла Х, значения больше, чем у узла Х.
- Префиксное дерево:
- Графы:
- Quadtree: #TODO
- Красно-черное дерево: #TODO
- Общее про деревья:
- Алгоритмы сортировки:
- Быстрая сортировка:
- Выбрать из массива опорный элемент.
- Взять два указателя, которые идут от начала и конца массива, до тех пор, пока не встретят элемент больше и меньше опорного.
- Поменять элементы местами и продолжить следование, пока указатели не пересекутся.
- При пересечении найдена позиция в массиве для опорного элемента.
- Рекурсивно повторить алгоритм для правого и левого отрезка.
- Алгоритмическая сложность - линейно-логарифмическое (O(n log(n))), в худшем случае квадратическая (O(n2)), при выборе опорным наименьший, либо наибольший элемент.
- Сортировка вставками:
- В начале работы алгоритма, отсортированная последовательность пуста.
- Поэлементно считываем массив и вставляем на нужную позицию в отсортированную последовательность.
- Алгоритмическая сложность - в среднем квадратичная, в лучшем случае линейная (При уже отсортированном массиве).
- Алгоритм можно улучшить, добавив бинарный поиск в момент вставки в отсортированную последовательность.
- Сортировка выбором:
- Проходим по всему массиву и находим наименьший элемент.
- Меняем его с первым элементом массива, повторяем для оставшихся элементов.
- Алгоритмическая сложность - квадратичная.
- Сортировка пузырьком:
- Итеративно проходим по массиву и меняем "пары" значений, до тех пор, пока они не будут отсортированы.
- Алгоритмическая сложность: квадратичная.
- Быстрая сортировка:
- Алгоритмы поиска:
- Алгоритмы кэширования: