Вы находитесь на странице: 1из 33

1.

Абстрактный тип данных «Стек»

Стек — абстрактный тип данных, представляющий собой список элементов,


организованных по принципу LIFO (англ. last in — first out, «последним пришёл —
первым вышел»).
Стек состоит из ячеек, которые представлены в виде структуры, содержащей
какие-либо данные и указатель типа данной структуры на следующий элемент.
Короче говоря стек, это как патроны в магазине автомата. У тебя сначала есть
пустой автомат потом ты заполняешь его патронами и по итогу патрон, который ты
вставлял первым, окажется в самом низу, и соответственно он вылетит при стрельбе
последним. Ну и соответственно тот патрон, который ты засунул в самом конце,
вылетит первым.
Стек можно сделать из чего угодно бля буду. Например, из векторов, массивов,
списков. Ну и может еще из чего, не ебу честно говоря.
По сути стек имеет несколько методов:
 создания (прим. Stack_create()) – ну создает стек в памяти;
 удаления (прим. Stack_delete(Stack stack)) – ну соответственно чистит
память и удаляет стек. В зависимости от использованного типа данных удаляется
немного по-разному, но суть одна. Надо просто удалить все значения стека;
 получение информации сверху стека (прим. Stack_get(Stack stack)) – ну
метод, который возвращает значение элемента сверху от стека. По сути как правило
работает вместе со следующим методом.
 Удаление верхушки стека (stack_pop(Stack stack)) – удаляет первый
верхний элемент стека. Что тут еще сказать.
 Добавление значение в верхушку стека (stack_push(Stack stack)) – не
поверишь, но добавляет значение в стек.
Рисунок 1 - картиночка стека, вот так он в абстракции и выглядит
2. Абстрактный тип данных «Очередь»
Очередь – это специальный тип списка. Очередью называют структуру, из
которой элементы удаляются с одного ее конца, называемого началом (головой), а
вставляются на противоположном конце, называемом (хвостом).
Очереди считаются списками типа FIFO (аббревиатура расшифровывается как
first in first out: первым вошел – первым вышел). Две основные операции, которые
определены для работы с очередью: вставка и извлечение элементов. Кроме того,
используются и другие операторы.
Короче говоря, очередь это как очередь в магазине. Забавно да? Ты идешь на
кассу и ждешь своей очереди, и соответственно к кассиру подходят все по очереди. Ну
типо кто первым подошел и встал в очередь, тот первым и выйдет из магазина. Ну
если представить, что в магазине никто не психанет и все будут упорно ждать встречи
с кассиром.
Сделать очередь можно списками, векторами, массивами тоже наверное, хуле
нет то, не пробовал но думаю заебок будет, правда хуйня но похуй.
По сути, типичная очередь имеет следующие методы:
 Добавление
 Удаление
 Добавление элемента в очередь. Добавляет вниз очереди.
 Удаление элемента из очереди. Удаляет элемент сверху.
 Получение значения сверху от очереди.
 В каких-то пиздатых очередях, можно посмотреть значение просто по
очереди, то есть не обязательно первого.
 Ну и всякая дичь, которая для себя нужна. Например проверка очереди на
пустоту (то есть пустая ли очередь ептеть).

Рисунок 2 - картинка очереди


3. Массив переменного размера. Эффективный алгоритм последовательного
роста размера массива
Динамический массив – это массив с переменным размером, т.е. количество
элементов может изменяться во время выполнения программы.
То есть при обычном массиве у тебя в программе указано количество элементов
массива, а в динамическом ты своими ручками указываешь сколько у тебя значений в
массивчике будет.
По сути алгоритм последовательного роста размера состоит в том, что ты
вводишь данные в массив до его заполнения и в случае, когда у тебя не хватает места в
массивчике ты создаешь еще один массив большего размера, копируешь туда данные
первого массива и удаляешь этот самый первый массив. По итогу у тебя есть
массивчик не с n-количеством элементов, а например с n*2 количеством элементов.
4. Стековая арифметика. Обратная польская запись. Алгоритм перевода
выражения из инфиксной нотации в префиксную
5. Динамическое программирование
Динамическое программирование — это когда у нас есть задача, которую
непонятно как решать, и мы разбиваем ее на меньшие задачи, которые тоже непонятно
как решать. Чисто в качестве примера можно вспомнить решение задачи Фибоначчи.
Чтобы успешно решить задачу динамикой нужно:
1) Состояние динамики: параметр(ы), однозначно задающие подзадачу.
2) Значения начальных состояний.
3) Переходы между состояниями: формула пересчёта.
4) Порядок пересчёта.
5) Положение ответа на задачу: иногда это сумма или, например, максимум из
значений нескольких состояний.
Порядок пересчёта
Существует три порядка пересчёта:
1) Прямой порядок:
Состояния последовательно пересчитывается исходя из уже посчитанных.

2) Обратный порядок:
Обновляются все состояния, зависящие от текущего состояния.

3) Ленивая динамика:
Рекурсивная мемоизированная функция пересчёта динамики. Это что-то вроде
поиска в глубину по ацикличному графу состояний, где рёбра — это зависимости
между ними.
6. Способы описания графов
7. Поиск в глубину. Алгоритм и применение
8. Поиск в ширину. Алгоритм и применение
9. Волновой алгоритм
10. Поиск сильно связных компонентов
11. Топологическая сортировка
12. Алгоритм Прима для построения минимального открывающего дерева
13. Алгоритм Крускала для построения минимального покрывающего дерева
14. Непересекающиеся множества
15. Алгоритм Дейкстры
16. Алгоритм Флойда
17. Двоичное дерево поиска. Обходы дерева
18. Рандомизированное двоичное дерево поиска
19. АВЛ-деревья
20. Красно-черные деревья
21. Расширяющиеся деревья (splay trees)
22. Декартовы деревья
23. Хеш-таблицы. Разрешение коллизий
24. Двоичные кучи. Очередь с приоритетами
25. Перебор с возвратом
26. Жадные алгоритмы
27. Код Хаффмена
28. Сортировка Хоара
29. Сортировка слиянием
30. Поразрядная сортировка
Поразрядная сортировка – это, по сути, сортировка (хз, наверное, чисто чисел,
но не факт), которая работает по разрядам. Неожиданно да? Мы просто идем по
каждому разряду числа и сортируем их. Как пример можно взять и
отсортировать данные числа справа налево по возрастанию. Не знаю, что тут
еще сказать, ахах.

Рисунок 3 - картиночка поразрядной сортировки


В качестве примера можно привести побитовую сортировку чисел. Мы же
помним, что вся информация в компьютерах хранится в различных типах
данных, длинна слова которых состоит из какого-то количества байтов. Байт же
состоит из 8 бит. Ну и, собственно, мы берем каждый бит числа и сортируем по
нему все числа. То есть мы берем числа и сравниваем их биты. Например, у нас
есть числа 2, 3, 1. Представим эти числа в битовом виде.

Рисунок 4 - пример сортировочки по битам


31. Алгоритм Карпа-Рабина
32. Алгоритм Кнута-Морриса-Пратта

Вам также может понравиться