Структура данных - это контейнер, информация в котором скомпонована характерным образом. Для каждой задачи - необходима своя.
Массивы - это простейшая и наиболее распространенная структура данных. Стеки и очереди, производны от массивов.
Стеки - линейная структура где все храниться в виде последовательной стопки (LIFO). Пример: Ctrl+Z или Stack память JAVA.
Очереди - линейная структура как стек, но по принципу FIFO.
Связные списки - линейная структура данных, похожа на массив. Отличается от массива по выделению памяти, внутренней структуре и процессу выполнения операции вставки и удаления. Состоит из цепочки узлов(Данные и ссылка на следующий элемент). Есть головной указатель, соответствующий первому элементу в связном списке, и, если список пуст, то он направлен просто на null.
Графы - это множество узлов, соединенных друг с другом в виде сети. Узлы также называются вершинами. Пара (x,y) называется ребром, это означает, что вершина x соединена с вершиной y. Ребро может иметь вес/стоимость — показатель, характеризующий, насколько затратен переход от вершины x к вершине y.
Деревья - это иерархическая структура данных, состоящая из вершин (узлов) и ребер, которые их соединяют. Деревья подобны графам, однако, ключевое отличие дерева от графа таково: в дереве не бывает циклов.
Боры(префиксное дерево) - это древовидная структура данных, которая особенно эффективна при решении задач на строки. Она обеспечивает быстрое извлечение данных и чаще всего применяется для поиска слов в словаре, автозавершений в поисковике и даже для IP-маршрутизации. Вот как три слова «top» (верх), «thus» (следовательно), and «their» (их) хранятся в бору:
Хеш-таблицы - хеширование — это процесс, применяемый для уникальной идентификации объектов и сохранения каждого объекта по заранее вычисленному индексу, именуемому его «ключом». Таким образом, объект хранится в виде «ключ-значение», а коллекция таких объектов называется «словарь». Каждый объект можно искать по его ключу. Существуют разные структуры данных, построенные по принципу хеширования, но чаще всего из таких структур применяется хеш-таблица.
Big O - необходимое количество шагов для выполнения алгоритма.
Время выполнения не зависит от размера входных данных.
Это как мгновенный доступ к элементу массива по индексу.
Пример: доступ к элементу массива по индексу.
В логарифмических алгоритмах задача сокращается на каждом шаге вдвое.
Пример: бинарный поиск в отсортированном массиве.
Время выполнения растёт пропорционально объёму входных данных.
Пример: поиск элемента в массиве перебором.
Время выполнения немного быстрее, чем квадратичное, и включает логарифмическое количество операций на каждый элемент.
Пример: сортировка массива алгоритмами быстрой сортировки(quick sort) или слиянием(merge sort).
Время выполнения растёт пропорционально квадрату входных данных.
В алгоритмах с квадратичной сложностью каждый элемент сравнивается с каждым другим.
Пример: сортировка пузырьком(Bubble Sort).
Время выполнения удваивается с каждым новым элементом входа. Такие алгоритмы быстро становятся неэффективными при больших объёмах данных.
Пример: генерация всех подмножеств множества.
Факториальная сложность возникает в задачах, связанных с вычислением всех возможных перестановок или комбинаций.
Пример: генерация всех перестановок множества.