Skip to content

Commit eb04173

Browse files
authored
theory (#55)
1 parent a314e67 commit eb04173

File tree

6 files changed

+172
-5
lines changed

6 files changed

+172
-5
lines changed

doc/README.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
1616
- Динамический массив.
1717
- Амортизационный анализ. Метод потенциалов. Метод монето
1818
- Амортизированное (учетное) время добавления элемента в динамический массив.
19-
- Двусвязный и односвязный список. Операции. Объединение списков.
20-
- Стек.
21-
- Очередь.
22-
- Дек.
19+
- [Двусвязный и односвязный список. Операции. Объединение списков.](topic1/question5.md)
20+
- [Стек.](topic1/question6.md)
21+
- [Очередь.](topic1/question7.md)
22+
- [Дек.](topic1/question8.md)
2323
- Хранение стека, очереди и дека в массиве. Циклическая очередь в массиве.
2424
- Хранение стека, очереди и дека в списке.
2525
- Поддержка минимума в стеке.
2626
- Представление очереди в виде двух стеков. Время извлечения элемента.
2727
- Поддержка минимума в очереди.
28-
- Двоичная куча. АТД “Очередь с приоритетом”.
28+
- [Двоичная куча. АТД “Очередь с приоритетом”.](topic1/question13.md)
2929

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

doc/topic1/question13.md

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Куча (Heap)
2+
3+
Куча (англ. heap) — абстрактная структура данных, поддерживающая следующие операции:
4+
5+
- Нахождение минимума.
6+
- Удаление минимума.
7+
- Добавление нового элемента в кучу.
8+
9+
Другое название, лучше отражающее функциональность — очередь с приоритетами (англ. priority queue).
10+
11+
## Устройство двоичной кучи
12+
13+
Двоичная куча (пирамида, сортирующее дерево, англ. binary heap) — реализация очереди с приоритетами, использующая корневое дерево, для которого выполнены три условия:
14+
15+
- Значение в любой вершине не больше, чем значения её потомков.
16+
- У любой вершины не более двух сыновей.
17+
- Слои заполняются последовательно сверху вниз и слева направо, без «дырок».
18+
19+
### Двоичная куча для максимума
20+
21+
Обозначим высоту дерева как \(h\). Так как куча всегда состоит из нескольких слоев заполненных полностью и одного заполненного частично, и каждый следующий слой содержит в два раза больше вершин, чем предыдущий, то высота дерева будет \(\Theta(\log{n})\).
22+
23+
Как и любая очередь с приоритетами, двоичная куча должна уметь выполнять операции:
24+
25+
- Нахождение минимума за \(O(1)\).
26+
- Удаление минимума за \(O(h)\).
27+
- Добавление нового элемента в кучу за \(O(h)\).
28+
29+
### Реализация
30+
31+
Хранить кучу будем в виде массива \(t\), где у корня индекс равен \(1\), а у вершины \(k\) индексы её детей равны \(2k\) и \(2k+1\). Нулевая ячейка массива при этом остается пустой.

doc/topic1/question5.md

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Связный список
2+
3+
Связный список является простейшим типом данных динамической структуры, состоящей из элементов (узлов).
4+
5+
## Структура узла
6+
7+
Каждый узел включает в себя в классическом варианте как минимум два поля:
8+
9+
- **данные** (в качестве данных может выступать переменная, объект класса или структуры и т. д.)
10+
- **указатель на следующий узел в списке** (указателей может быть несколько).
11+
12+
Элементы связанного списка можно помещать и исключать произвольным образом.
13+
14+
Доступ к списку осуществляется через указатель, который содержит адрес первого элемента списка, называемый корнем списка.
15+
16+
## Классификация списков
17+
18+
По количеству полей указателей различают списки:
19+
20+
- **однонаправленный (односвязный)**
21+
- **двунаправленный (двусвязный)**
22+
23+
### Односвязный и двусвязный списки
24+
25+
- **Односвязный список**, содержащий только один указатель на следующий элемент.
26+
- **Двусвязный список**, содержащий два поля указателя – на следующий элемент и на предыдущий.
27+
28+
По способу связи элементов различают линейные и циклические списки.
29+
30+
## Виды списков
31+
32+
Таким образом, различают 4 основных вида списков:
33+
34+
- **Односвязный линейный список (ОЛС)**. Каждый узел ОЛС содержит 1 поле указателя на следующий узел. Поле указателя последнего узла содержит нулевое значение (указывает на NULL).
35+
- **Односвязный циклический список (ОЦС)**. Каждый узел ОЦС содержит 1 поле указателя на следующий узел. Поле указателя последнего узла содержит адрес первого узла (корня списка).
36+
- **Двусвязный линейный список (ДЛС)**. Каждый узел ДЛС содержит два поля указателей: на следующий и на предыдущий узел. Поле указателя на следующий узел последнего узла содержит нулевое значение (указывает на NULL). Поле указателя на предыдущий узел первого узла (корня списка) также содержит нулевое значение (указывает на NULL).
37+
- **Двусвязный циклический список (ДЦС)**. Каждый узел ДЦС содержит два поля указателей: на следующий и на предыдущий узел. Поле указателя на следующий узел последнего узла содержит адрес первого узла (корня списка). Поле указателя на предыдущий узел первого узла (корня списка) содержит адрес последнего узла.
38+
39+
## Сравнение массивов и связных списков
40+
41+
- **Выделение памяти**: Массив - выделение памяти осуществляется единовременно под весь массив до начала его использования. Список - выделение памяти осуществляется по мере ввода новых элементов.
42+
- **Удаление/добавление элемента**: Массив - при удалении/добавлении элемента требуется копирование всех последующих элементов для осуществления их сдвига. Список - удаление/добавление элемента осуществляется переустановкой указателей, при этом сами данные не копируются.
43+
- **Занимаемая память**: Массив - для хранения элемента требуется объем памяти, необходимый только для хранения данных этого элемента. Список - для хранения элемента требуется объем памяти, достаточный для хранения данных этого элемента и указателей (1 или 2) на другие элементы списка.
44+
- **Доступ к элементам**: Массив - доступ к элементам может осуществляться в произвольном порядке. Список - возможен только последовательный доступ к элементам.
45+
46+
Как видим, каждый тип данных обладает своими достоинствами и недостатками. Выбор в пользу того или иного типа данных будет зависеть от решаемой задачи.

doc/topic1/question6.md

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
## Стек
2+
3+
### Определение
4+
5+
Стеком (англ. stack) называется хранилище данных, в котором можно работать только с одним элементом: тем, который был добавлен в стек последним. Стек должен поддерживать следующие операции:
6+
7+
- `push`: Добавить (положить) в конец стека новый элемент.
8+
- `pop`: Извлечь из стека последний элемент.
9+
- `back`: Узнать значение последнего элемента (не удаляя его).
10+
- `size`: Узнать количество элементов в стеке.
11+
- `clear`: Очистить стек (удалить из него все элементы).
12+
13+
### Структура данных Stack
14+
15+
- stack(); // Конструктор
16+
- ~stack(); // Деструктор
17+
- void push(int d); // Добавить в стек новый элемент
18+
- int pop(); // Удалить из стека последний элемент и вернуть его значение
19+
- int back(); // Вернуть значение последнего элемента
20+
- int size(); // Вернуть количество элементов в стеке
21+
- void clear(); // Очистить стек
22+
23+
### Упражнение A - Простой стек
24+
25+
- Реализуйте структуру данных "стек", реализовав все указанные методы.
26+
- Напишите программу (функцию main), содержащую описание стека и моделирующую работу стека.
27+
28+
### Упражнение B - Стек с обработкой ошибок
29+
30+
- Аналогично предыдущему заданию, только снимается ограничение на корректность вызовов методов back и pop.
31+
32+
### Упражнение C - Стек без ограничения на размер
33+
34+
- Реализуйте стек динамического размера, то есть ограниченный только объемом свободной оперативной памяти.

doc/topic1/question7.md

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
## Очередь
2+
3+
### Определение
4+
5+
Очередью (англ. queue) называется структура данных, в которой элементы кладутся в конец, а извлекаются из начала. Первым из очереди будет извлечен тот элемент, который будет добавлен раньше других.
6+
7+
### Структура данных Queue
8+
9+
- queue(); // Конструктор
10+
- ~queue(); // Деструктор
11+
- void push(int d); // Добавить в очередь новый элемент
12+
- int pop(); // Удалить из очереди первый элемент и вернуть его значение
13+
- int front(); // Вернуть значение первого элемента
14+
- int size(); // Вернуть количество элементов в очереди
15+
- void clear(); // Очистить очередь
16+
17+
### Упражнение D - Простая очередь
18+
19+
- Реализуйте простейшую очередь, размер которой не превосходит 100 элементов.
20+
21+
### Упражнение E - Очередь с обработкой ошибок
22+
23+
- Аналогично заданию B, но для очереди.
24+
25+
### Упражнение F - Очередь без ограничений на размер
26+
27+
- Аналогично заданию C, но для очереди.

doc/topic1/question8.md

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
## Дек
2+
3+
### Определение
4+
5+
Деком (англ. deque – аббревиатура от double-ended queue, двухсторонняя очередь) называется структура данных, в которую можно удалять и добавлять элементы как в начало, так и в конец.
6+
7+
### Структура данных Deque
8+
9+
- push_front Добавить (положить) в начало дека новый элемент
10+
- push_back Добавить (положить) в конец дека новый элемент
11+
- pop_front Извлечь из дека первый элемент
12+
- pop_back Извлечь из дека последний элемент
13+
- front Узнать значение первого элемента (не удаляя его)
14+
- back Узнать значение последнего элемента (не удаляя его)
15+
- size Узнать количество элементов в деке
16+
- clear Очистить дек (удалить из него все элементы)
17+
18+
19+
### Упражнение G - Простой дек
20+
21+
- Аналогично заданиям A и D, но для дека.
22+
23+
### Упражнение H - Дек с обработкой ошибок
24+
25+
- Аналогично заданиям B и E, но для дека.
26+
27+
### Упражнение I - Дек неограниченного размера
28+
29+
- Аналогично заданию C и F, но для дека.

0 commit comments

Comments
 (0)