Skip to content

theory #55

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jun 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions doc/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,16 @@
- Динамический массив.
- Амортизационный анализ. Метод потенциалов. Метод монето
- Амортизированное (учетное) время добавления элемента в динамический массив.
- Двусвязный и односвязный список. Операции. Объединение списков.
- Стек.
- Очередь.
- Дек.
- [Двусвязный и односвязный список. Операции. Объединение списков.](topic1/question5.md)
- [Стек.](topic1/question6.md)
- [Очередь.](topic1/question7.md)
- [Дек.](topic1/question8.md)
- Хранение стека, очереди и дека в массиве. Циклическая очередь в массиве.
- Хранение стека, очереди и дека в списке.
- Поддержка минимума в стеке.
- Представление очереди в виде двух стеков. Время извлечения элемента.
- Поддержка минимума в очереди.
- Двоичная куча. АТД “Очередь с приоритетом”.
- [Двоичная куча. АТД “Очередь с приоритетом”.](topic1/question13.md)

# ТЕМА 2. СОРТИРОВКИ И ПОРЯДКОВЫЕ СТАТИСТИКИ

Expand Down
31 changes: 31 additions & 0 deletions doc/topic1/question13.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Куча (Heap)

Куча (англ. heap) — абстрактная структура данных, поддерживающая следующие операции:

- Нахождение минимума.
- Удаление минимума.
- Добавление нового элемента в кучу.

Другое название, лучше отражающее функциональность — очередь с приоритетами (англ. priority queue).

## Устройство двоичной кучи

Двоичная куча (пирамида, сортирующее дерево, англ. binary heap) — реализация очереди с приоритетами, использующая корневое дерево, для которого выполнены три условия:

- Значение в любой вершине не больше, чем значения её потомков.
- У любой вершины не более двух сыновей.
- Слои заполняются последовательно сверху вниз и слева направо, без «дырок».

### Двоичная куча для максимума

Обозначим высоту дерева как \(h\). Так как куча всегда состоит из нескольких слоев заполненных полностью и одного заполненного частично, и каждый следующий слой содержит в два раза больше вершин, чем предыдущий, то высота дерева будет \(\Theta(\log{n})\).

Как и любая очередь с приоритетами, двоичная куча должна уметь выполнять операции:

- Нахождение минимума за \(O(1)\).
- Удаление минимума за \(O(h)\).
- Добавление нового элемента в кучу за \(O(h)\).

### Реализация

Хранить кучу будем в виде массива \(t\), где у корня индекс равен \(1\), а у вершины \(k\) индексы её детей равны \(2k\) и \(2k+1\). Нулевая ячейка массива при этом остается пустой.
46 changes: 46 additions & 0 deletions doc/topic1/question5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Связный список

Связный список является простейшим типом данных динамической структуры, состоящей из элементов (узлов).

## Структура узла

Каждый узел включает в себя в классическом варианте как минимум два поля:

- **данные** (в качестве данных может выступать переменная, объект класса или структуры и т. д.)
- **указатель на следующий узел в списке** (указателей может быть несколько).

Элементы связанного списка можно помещать и исключать произвольным образом.

Доступ к списку осуществляется через указатель, который содержит адрес первого элемента списка, называемый корнем списка.

## Классификация списков

По количеству полей указателей различают списки:

- **однонаправленный (односвязный)**
- **двунаправленный (двусвязный)**

### Односвязный и двусвязный списки

- **Односвязный список**, содержащий только один указатель на следующий элемент.
- **Двусвязный список**, содержащий два поля указателя – на следующий элемент и на предыдущий.

По способу связи элементов различают линейные и циклические списки.

## Виды списков

Таким образом, различают 4 основных вида списков:

- **Односвязный линейный список (ОЛС)**. Каждый узел ОЛС содержит 1 поле указателя на следующий узел. Поле указателя последнего узла содержит нулевое значение (указывает на NULL).
- **Односвязный циклический список (ОЦС)**. Каждый узел ОЦС содержит 1 поле указателя на следующий узел. Поле указателя последнего узла содержит адрес первого узла (корня списка).
- **Двусвязный линейный список (ДЛС)**. Каждый узел ДЛС содержит два поля указателей: на следующий и на предыдущий узел. Поле указателя на следующий узел последнего узла содержит нулевое значение (указывает на NULL). Поле указателя на предыдущий узел первого узла (корня списка) также содержит нулевое значение (указывает на NULL).
- **Двусвязный циклический список (ДЦС)**. Каждый узел ДЦС содержит два поля указателей: на следующий и на предыдущий узел. Поле указателя на следующий узел последнего узла содержит адрес первого узла (корня списка). Поле указателя на предыдущий узел первого узла (корня списка) содержит адрес последнего узла.

## Сравнение массивов и связных списков

- **Выделение памяти**: Массив - выделение памяти осуществляется единовременно под весь массив до начала его использования. Список - выделение памяти осуществляется по мере ввода новых элементов.
- **Удаление/добавление элемента**: Массив - при удалении/добавлении элемента требуется копирование всех последующих элементов для осуществления их сдвига. Список - удаление/добавление элемента осуществляется переустановкой указателей, при этом сами данные не копируются.
- **Занимаемая память**: Массив - для хранения элемента требуется объем памяти, необходимый только для хранения данных этого элемента. Список - для хранения элемента требуется объем памяти, достаточный для хранения данных этого элемента и указателей (1 или 2) на другие элементы списка.
- **Доступ к элементам**: Массив - доступ к элементам может осуществляться в произвольном порядке. Список - возможен только последовательный доступ к элементам.

Как видим, каждый тип данных обладает своими достоинствами и недостатками. Выбор в пользу того или иного типа данных будет зависеть от решаемой задачи.
34 changes: 34 additions & 0 deletions doc/topic1/question6.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
## Стек

### Определение

Стеком (англ. stack) называется хранилище данных, в котором можно работать только с одним элементом: тем, который был добавлен в стек последним. Стек должен поддерживать следующие операции:

- `push`: Добавить (положить) в конец стека новый элемент.
- `pop`: Извлечь из стека последний элемент.
- `back`: Узнать значение последнего элемента (не удаляя его).
- `size`: Узнать количество элементов в стеке.
- `clear`: Очистить стек (удалить из него все элементы).

### Структура данных Stack

- stack(); // Конструктор
- ~stack(); // Деструктор
- void push(int d); // Добавить в стек новый элемент
- int pop(); // Удалить из стека последний элемент и вернуть его значение
- int back(); // Вернуть значение последнего элемента
- int size(); // Вернуть количество элементов в стеке
- void clear(); // Очистить стек

### Упражнение A - Простой стек

- Реализуйте структуру данных "стек", реализовав все указанные методы.
- Напишите программу (функцию main), содержащую описание стека и моделирующую работу стека.

### Упражнение B - Стек с обработкой ошибок

- Аналогично предыдущему заданию, только снимается ограничение на корректность вызовов методов back и pop.

### Упражнение C - Стек без ограничения на размер

- Реализуйте стек динамического размера, то есть ограниченный только объемом свободной оперативной памяти.
27 changes: 27 additions & 0 deletions doc/topic1/question7.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
## Очередь

### Определение

Очередью (англ. queue) называется структура данных, в которой элементы кладутся в конец, а извлекаются из начала. Первым из очереди будет извлечен тот элемент, который будет добавлен раньше других.

### Структура данных Queue

- queue(); // Конструктор
- ~queue(); // Деструктор
- void push(int d); // Добавить в очередь новый элемент
- int pop(); // Удалить из очереди первый элемент и вернуть его значение
- int front(); // Вернуть значение первого элемента
- int size(); // Вернуть количество элементов в очереди
- void clear(); // Очистить очередь

### Упражнение D - Простая очередь

- Реализуйте простейшую очередь, размер которой не превосходит 100 элементов.

### Упражнение E - Очередь с обработкой ошибок

- Аналогично заданию B, но для очереди.

### Упражнение F - Очередь без ограничений на размер

- Аналогично заданию C, но для очереди.
29 changes: 29 additions & 0 deletions doc/topic1/question8.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
## Дек

### Определение

Деком (англ. deque – аббревиатура от double-ended queue, двухсторонняя очередь) называется структура данных, в которую можно удалять и добавлять элементы как в начало, так и в конец.

### Структура данных Deque

- push_front Добавить (положить) в начало дека новый элемент
- push_back Добавить (положить) в конец дека новый элемент
- pop_front Извлечь из дека первый элемент
- pop_back Извлечь из дека последний элемент
- front Узнать значение первого элемента (не удаляя его)
- back Узнать значение последнего элемента (не удаляя его)
- size Узнать количество элементов в деке
- clear Очистить дек (удалить из него все элементы)


### Упражнение G - Простой дек

- Аналогично заданиям A и D, но для дека.

### Упражнение H - Дек с обработкой ошибок

- Аналогично заданиям B и E, но для дека.

### Упражнение I - Дек неограниченного размера

- Аналогично заданию C и F, но для дека.
Loading