Основы программного конструирования
Связные списки
Операции со связным списком
Свойства связного списка
Стек через связный список
Двусвязный список
Примеры использования списков
Кольцевой связный список
Применение кольцевых списков
Двухсвязный кольцевой список
Два способа смотреть на данные
Иерархия
Очередь с приоритетом
Очередь с приоритетом: реализация
Очередь с приоритетом: реализация
Очередь с приоритетом: эффективная реализация
Очередь с приоритетом: извлечение
Очередь с приоритетом: добавление
Далее: найти общее
Генеалогическое дерево
Файлы и каталоги
Структура организации
Структура данных: дерево
Древоведение
Интерфейс дерева
Реализация деревьев
Двоичное (бинарное) дерево
Реализация двоичных деревьев
Арифметическое выражение
Обходы двоичного дерева
Обходы дерева выражения
Преобразование любого дерева в двоичное
Дерево поиска
Интерфейс дерева поиска
Высота дерева поиска
Не все деревья одинаково полезны
На сегодня все
1.07M

7 лекция_2026

1. Основы программного конструирования

ЛЕКЦИЯ №6
31 МАРТА 2026

2. Связные списки

Связный список (linked list) – линейно упорядоченный набор
элементов, каждый из которых содержит связь со следующим
элементов.
Голова
Хвост

3. Операции со связным списком

Вставка элемента в голову.
Вставка элемента в середину.
Удаление элемента.
Обход списка.
Поиск элемента по критерию.
Голова
Хвост

4. Свойства связного списка

Динамическая структура данных.
Вставка и удаление выполняются за О(1).
Медленный поиск по номеру (индексирование): О(N).

5. Стек через связный список

Связный список с использованием динамической памяти.
class StackNode:
pass
stack = None
n1=StackNode()
n1.value = 10
n1.next = stack
stack= n1
n2=StackNode()
n2.value = 20
n2.next = stack
stack = n2
print(stack.value)#20
stack=stack.next
print(stack.value)#10

6. Двусвязный список

Преимущество: одинаковая легкость операций в обе стороны
Голова
Хвост

7. Примеры использования списков

Многочлены (символьная алгебра).
Реализация стеков и очередей.
Цепочки кластеров в файловых системах.

8. Кольцевой связный список

Голова?

9. Применение кольцевых списков

Список вершин многоугольника.
Список процессов в системе с разделением времени.
Кольцо буферов ввода\вывода.

10. Двухсвязный кольцевой список

11. Два способа смотреть на данные

«Черный ящик»
Операции
«Белый ящик»
Устройство

12. Иерархия

Абстрактные типы данных:
Последовательности (стек,
очередь, дек)
Множества
Словари
Графы
Структуры данных:
Массивы
Связанные списки
Деревья (дерево поиска,
двоичная куча)
Хеш-таблицы

13. Очередь с приоритетом

АТД очередь с приоритетом (priority queue).
Основные операции:
Добавление элементов с некоторым приоритетом;
Извлечение элемента с максимальным приоритетом.
Коля
Дима 6
Маша 9
Петя
7
1
Женя
Вася
5
4

14. Очередь с приоритетом: реализация

Через неотсортированный массив (или список): добавление за
O(1), извлечение за О(N).
Дима 6
Коля 1
Женя 4
Петя 7
Маша 9
Вася 5

15. Очередь с приоритетом: реализация

Через неотсортированный массив (или список): добавление за
O(1), извлечение за О(N).
Дима 6
Коля 1
Женя 4
Петя 7
Маша 9
Вася 5
Через отсортированный массив (или список): добавление за
О(N), извлечение за О(1).
Коля 1
Женя 4
Вася 5
Дима 6
Петя 7
Маша 9

16. Очередь с приоритетом: эффективная реализация

Через пирамиду (binary
heap).
Маша 9
Максимальный элемент
в корне.
Сложность: добавление
и извлечение за О(log N).
Женя 4
Вася
Петя
5
Коля 1
Дима 6
7

17. Очередь с приоритетом: извлечение

Запоминаем элемент из корня
Переставляем последний элемент пирамиды в корень
«Топим» корень для наведения порядка
Возвращаем запомненный элемент

18. Очередь с приоритетом: добавление

Добавляем последний элемент в конец пирамиды
«Всплываем» последний элемент для наведения порядка
(аналогично утоплению).

19. Далее: найти общее

20. Генеалогическое дерево

21. Файлы и каталоги

22. Структура организации

23. Структура данных: дерево

Состоит из элементов (узлов).
Имеет корень (узел без родителя).
Все остальные узлы, кроме корня (узлы с одним родителем), распределены по
непересекающимся подмножествам — поддеревьям.

24. Древоведение

Корень (root) (2).
2
Листья (leaf) (3, 6, 5, 7).
Родитель (parent) (2 для 4, 5, 7; 4 для 3; 5 для 6, 5) и
потомки (children).
Сестринские узлы (siblings) (4, 5 и 7; 6 и 5).
4
3
5
6
7
5

25. Интерфейс дерева

Вставка узла.
Удаление узла.
Обход дерева (посещение всех узлов).
Переходы (от потомка к родителю, от сестринского узла к другому сестринскому и т.д.)

26. Реализация деревьев

class TreeNode:
# parent:
Optional[TreeNode]
# children: List[TreeNode]
# data:
Any
Динамический массив ссылок на
дочерние узлы

27. Двоичное (бинарное) дерево

У каждого узла максимум два потомка: левый и правый.
Может быть так, что правый потомок присутствует, а левый — нет.
Допустимо пустое двоичное дерево.

28. Реализация двоичных деревьев

class TreeNode:
# parent: Optional[TreeNode]
# left:
Optional[TreeNode]
# right: Optional[TreeNode]
# data:
Any
Популярность двоичных деревьев
связана с удобством представления
и работы с ними

29. Арифметическое выражение

4×3+(2×7−5)
+
×
4

3
×
2
5
7

30. Обходы двоичного дерева

Сверху вниз: P, L, R.
Слева направо: L, P, R.
P
Снизу вверх: L, R, P.
L
R

31. Обходы дерева выражения

Сверху вниз (PLR) (префиксный)
+×43−×275
+
×
4

3
×
Слева направо (LPR) (инфиксный)
4×3+2×7−5
5
Снизу вверх (LRP) (постфиксный)
43×27×5−+
2
7

32. Преобразование любого дерева в двоичное

D
E
H
D
F
J
G
K
E
F
G
H
J
K

33. Дерево поиска

BST (Binary Search Tree).
Каждому узлу n сопоставлен ключ k(n).
k(x) < k(n) для x из левого поддерева n.
k(y) > k(n) для y из правого поддерева n.
Тривиальный алгоритм поиска.

34. Интерфейс дерева поиска

Поиск элемента по ключу
Вставка элемента по ключу
Удаление элемента по ключу
Перечисление всех ключей
Поиск и вставка за O(h(N))!

35. Высота дерева поиска

Бинарное дерево высоты h содержит максимум 2h–1 узлов.
Значит высота h(N) ≥ log(N).
При добавлении случайных элементов h(N) ~ 2,99 log(N).
Средняя глубина узла ~ 1,39 log(N).
Но в худшем случае…

36. Не все деревья одинаково полезны

37. На сегодня все

English     Русский Rules