Skip to content

Commit 5c4b472

Browse files
committed
feat: move unfinished topics to another branch
1 parent a359d1a commit 5c4b472

13 files changed

Lines changed: 135 additions & 185 deletions

File tree

README.md

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
# Алгоритмы
1+
# Algorithms Course
22

3-
Курс по алгоритмам и структурам данных с разбором теории и решением задач.
3+
Авторский курс по алгоритмам и структурам данных с разбором теории и решением задач.
44

5-
## Основные фичи
5+
## Ключевые особенности
66

7-
- **10+** разобранных тем, к каждой теме легкий конспект
7+
- **13** разобранных тем, к каждой теме легкий конспект
88
- **70+** практических задач с LeetCode, тренировок от Яндекса и реальных собеседований
99
- Решение **к каждой задаче** на лаконичном Python с комментариями
10-
- **750+** автоматизированных тестов для проверки решений
10+
- **800+** автоматизированных тестов для проверки решений
1111

1212
## Структура курса
1313

@@ -26,9 +26,14 @@
2626
| 11 | Теория чисел | Продвинутые подходы | `k_number_theory` |
2727
| 12 | 2D Динамическое программирование | Продвинутые подходы | `l_dp2` |
2828
| 13 | Деревья | Продвинутые структуры данных | `m_trees` |
29-
| 14 | Графы | Продвинутые структуры данных | `n_graphs` |
3029

31-
Каждая тема содержит теорию, практические задачи и их решения.
30+
Каждая тема содержит:
31+
32+
* **Теоретический конспект**, легко и доступно объясняющий тему (файл `ABSTRACT.md`)
33+
* **Подборка задач** разного уровня сложности на отработку полученных навыков (файл `README.md`)
34+
* **Решения задач** из подборки на Python (файлы `*.py`, например `fib.py`)
35+
* **Автотесты** для каждого решения, покрывающие минимальный набор ошибок (папка `/tests/`, например
36+
`/tests/test_intro/test_fib.py`)
3237

3338
## Источники
3439

snippets/__init__.py

Whitespace-only changes.

snippets/huffman_heap.py

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/m_trees/ABSTRACT.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,3 +165,91 @@ A -> B -> D -> E -> C -> F
165165
* **Прямой обход** (Pre-order): сначала посещается корень, затем левое поддерево, затем правое поддерево.
166166
* **Симметричный обход** (In-order): сначала посещается левое поддерево, затем корень, затем правое поддерево.
167167
* **Обратный обход** (Post-order): сначала посещается левое поддерево, затем правое поддерево, затем корень.
168+
169+
## Обход в ширину
170+
171+
**BFS** (Breadth-First Search) - обход в ширину - это алгоритм обхода графа или дерева, который начинается с
172+
начальной вершины и проходит по всем вершинам на текущем уровне, прежде чем перейти к следующему уровню.
173+
Сложность BFS: O(N), N = V + E, где V - количество вершин, E - количество ребер.
174+
175+
Пример.
176+
Возьмем дерево:
177+
178+
```text
179+
A
180+
/ \
181+
B C
182+
/ \ \
183+
D E F
184+
```
185+
186+
Обход в ширину начинается с вершины A и проходит по всем вершинам на текущем уровне:
187+
188+
```text
189+
A -> B -> C -> D -> E -> F
190+
```
191+
192+
По-другому обход в ширину можно представить в виде уровней:
193+
194+
```text
195+
Уровень 0: A
196+
Уровень 1: B, C
197+
Уровень 2: D, E, F
198+
```
199+
200+
Поэтому обход в ширину также называют **уровневым обходом** (Level-order).
201+
202+
## Деревья поиска
203+
204+
**Дерево поиска** - это двоичное дерево, в котором для каждой вершины выполняется следующее условие:
205+
206+
* Все ключи в левом поддереве меньше ключа вершины.
207+
* Все ключи в правом поддереве больше ключа вершины.
208+
* Левое и правое поддеревья также являются деревьями поиска.
209+
210+
Деревья поиска позволяют эффективно выполнять операции поиска, вставки и удаления элементов.
211+
212+
Сложность операций в дереве поиска: O(log N) в среднем случае, O(N) в худшем случае (если дерево вырождено в список).
213+
214+
Пример.
215+
216+
```text
217+
4
218+
/ \
219+
2 6
220+
/ \ \
221+
1 3 5
222+
```
223+
224+
## Сбалансированные деревья
225+
226+
**Сбалансированное дерево** - это дерево, в котором высота левого и правого поддеревьев для каждой вершины отличается не
227+
более чем на 1.
228+
229+
Сбалансированные деревья позволяют поддерживать операции поиска, вставки и удаления элементов с логарифмической
230+
сложностью O(log N) в худшем случае.
231+
232+
Пример сбалансированного дерева:
233+
234+
```text
235+
4
236+
/ \
237+
2 6
238+
/ \ \
239+
1 3 5
240+
```
241+
242+
Это дерево сбалансировано, потому что высота левого и правого поддеревьев для каждой вершины отличается
243+
не более чем на 1.
244+
245+
Существует несколько типов сбалансированных деревьев:
246+
247+
* **AVL-деревья** - это сбалансированные двоичные деревья поиска, в которых для каждой вершины высота левого и правого
248+
поддеревьев отличается не более чем на 1.
249+
* **Красно-черные деревья** - это сбалансированные двоичные деревья поиска, в которых каждая вершина имеет цвет (красный
250+
или черный) и выполняются определенные правила для поддержания баланса.
251+
* **Splay-деревья** - это сбалансированные двоичные деревья поиска, которые автоматически перемещают часто
252+
используемые элементы ближе к корню дерева, что позволяет ускорить доступ к ним.
253+
* **B-деревья** - это сбалансированные деревья поиска, которые используются в базах данных и файловых системах для
254+
эффективного хранения и поиска больших объемов данных. Они позволяют хранить множество ключей в одной вершине и
255+
обеспечивают логарифмическую сложность операций поиска, вставки и удаления.

src/m_trees/dfs_iterative.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def dfs_preorder_iterative(node: BNode) -> list[int]:
4545
while st:
4646
node = st.pop()
4747
result.append(node.key)
48-
# Push right first so that left is processed first
48+
# Кладем в стек правого потомка перед левого, чтобы левый обрабатывался первым
4949
if node.right is not None:
5050
st.append(node.right)
5151
if node.left is not None:
@@ -63,12 +63,12 @@ def dfs_postorder_iterative(node: BNode) -> list[int]:
6363
while st:
6464
node = st.pop()
6565
result.append(node.key)
66-
# Push left first so that right is processed first
66+
# Кладем в стек левого потомка перед правого, чтобы правый обрабатывался первым
6767
if node.left is not None:
6868
st.append(node.left)
6969
if node.right is not None:
7070
st.append(node.right)
71-
# Reverse the result to get postorder
71+
# Поскольку мы добавляли узлы в обратном порядке, нужно развернуть результат
7272
result.reverse()
7373
return result
7474

@@ -82,13 +82,12 @@ def dfs_inorder_iterative(node: BNode) -> list[int]:
8282
result: list[int] = []
8383
curr: BNode | None = node
8484
while st or curr is not None:
85-
# Go to the leftmost node
85+
# Переходим к самому левому узлу
8686
if curr is not None:
8787
st.append(curr)
8888
curr = curr.left
89-
# Process the node
9089
else:
91-
# Pop from stack and visit the node
90+
# Когда достигли самого левого узла, обрабатываем егои переходим к правому
9291
curr = st.pop()
9392
result.append(curr.key)
9493
curr = curr.right

src/m_trees/tree_height.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from collections import deque
2+
3+
14
# O(n^2)
25
def tree_height_naive(parents: list[int], node: int = -1) -> int:
36
n = len(parents)
@@ -46,3 +49,26 @@ def dfs_iterative(node: int, tree: list[list[int]]) -> int:
4649
# Обновляем высоту дерева для текущего узла
4750
dp[child] = max(dp[child], dp[curr] + 1)
4851
return max(dp)
52+
53+
54+
# O(n)
55+
def tree_height_bfs(parents: list[int]) -> int:
56+
root, adjacency_list = build_tree(parents)
57+
return bfs(root, adjacency_list)
58+
59+
60+
# O(n)
61+
def bfs(node: int, tree: list[list[int]]) -> int:
62+
n = len(tree)
63+
dp = [1] * n
64+
queue = deque([node])
65+
visited = [False] * n
66+
while queue:
67+
curr = queue.popleft()
68+
if visited[curr]:
69+
continue
70+
visited[curr] = True
71+
for child in tree[curr]:
72+
queue.append(child)
73+
dp[child] = max(dp[child], dp[curr] + 1)
74+
return max(dp)

src/n_graphs/README.md

Lines changed: 0 additions & 50 deletions
This file was deleted.

src/n_graphs/__init__.py

Whitespace-only changes.

src/n_graphs/dfs.py

Lines changed: 0 additions & 28 deletions
This file was deleted.

src/n_graphs/greed_stone.py

Lines changed: 0 additions & 46 deletions
This file was deleted.

0 commit comments

Comments
 (0)