- •Структуры данных. Классификация
- •Алгоритмы. Определение. Как алгоритмы соотносятся со структурами данных.
- •Оценка сложности алгоритма. Способы. Меры оценки сложности.
- •Оценка сложности алгоритма. Худший, лучший случай и в среднем.
- •Массивы и сортировка массивов. Сортировка Шелла.Алг. Сложность
- •Массивы и сортировка массивов. Быстрая сортировка. Алг. Сложность
- •Списки. Виды списков. Организация списков при помощи массивов.
- •Стек. Организация стека при помощи массива, динамической структуры.
- •Очередь. Организация очереди при помощи массива. Динамической структуры.Двух стеков.
- •Деревья. Определения. Высота, степень дерева, степень узла. Бинарные деревья.
- •Бинарные деревья. Организация бинарных деревьев при помощи массива.
- •Бинарные деревья поиска. Организация деревьев при помощи динамических структур.
- •Бинарные деревья поиска. Операции. Удаление элементов из дерева. Случай 1. Узел — лист (нет потомков)
- •🔹 Случай 2. У узла один потомок (только левое или только правое поддерево)
- •🔹 Случай 3. У узла два потомка
- •Бинарные деревья. Стратегии обхода деревьев. В ширину.
- •Бинарные деревья. Стратегии обхода деревьев. В глубину.
- •Графы. Способы задания графов. Матрица инцидентности. Матрица смежности.
- •🔸 1. Матрица смежности
- •🔸 2. Матрица инцидентности
- •Графы. Обходы графов. Поиск в ширину и глубину.
- •Кратчайшие пути на графах. Алгоритм дейстры
- •Хранение данных в формате json
Стек. Организация стека при помощи массива, динамической структуры.
Стек — это упорядоченная структура данных, в которой элементы добавляются и удаляются только с одного конца, называемого вершиной стека. Стек работает по принципу «последним пришёл — первым вышел»
Здесь каждый элемент стека — это отдельный узел, создаваемый в куче. Каждый узел содержит:
1)данные (например, число),
2)ссылку на следующий узел (тот, что лежит ниже в стеке).
3)При добавлении (push) создаётся новый узел, его ссылка указывает на текущий верхний элемент, а сам он становится новой вершиной.
4)При удалении (pop) верхний узел «отцепляется», возвращается его значение, и вершиной становится следующий узел.
5)Данные стека разбросаны по разным участкам оперативной памяти, но связаны ссылками — как в связном списке. Плюс: стек может расти неограниченно (пока есть память), не нужно заранее задавать размер. Минус: чуть больше накладных расходов на хранение ссылок и выделение памяти.
Очередь. Организация очереди при помощи массива. Динамической структуры.Двух стеков.
Очередь — это структура данных, в которой элементы обрабатываются по принципу «первым пришёл — первым вышел» (FIFO: First In – First Out).
1. Очередь через массив
Выделяем обычный массив и заводим два индекса:
начало — откуда забираем элементы,
конец — куда добавляем новые.
При добавлении — кладём элемент в позицию конец и сдвигаем его вправо.
При удалении — берём элемент из позиции начало и сдвигаем его вправо.
Решение — циклическая (кольцевая) очередь: когда указатель доходит до конца массива, он возвращается в начало, если там есть свободное место. Тогда память используется эффективно.
2. Очередь через динамическую структуру (в куче)
Здесь каждый элемент — это отдельный узел, созданный в куче.
Узел содержит:
данные,
ссылку на следующий узел.
Храним две ссылки:
1)голова — первый элемент (откуда забираем),
2)хвост — последний элемент (куда добавляем).
При добавлении — создаём новый узел, привязываем его к хвосту, и хвост теперь указывает на него.
При удалении — забираем узел из головы, и голова переходит к следующему.
Плюсы:
Очередь может расти неограниченно (пока есть память),
Нет «мертвых зон».
Минус:
Узлы разбросаны по памяти, и каждый занимает немного больше места из-за ссылки.
3. Очередь через два стека
Это интересный способ, который показывает, как одни структуры можно строить на других.
Заводим два стека:
вход — туда кладём новые элементы,
выход — оттуда забираем.
Правило:
При добавлении — просто кладём элемент в стек вход.
При удалении:
Если стек выход не пуст, берём оттуда верхний элемент.
Если выход пуст, перекладываем все элементы из вход в выход (по одному, через pop/push).
При этом порядок разворачивается, и самый старый элемент оказывается сверху в выходе — его и возвращаем.
Так как стек — LIFO, а мы делаем два LIFO подряд, получаем FIFO — то есть очередь.
Деревья. Определения. Высота, степень дерева, степень узла. Бинарные деревья.
Дерево — это иерархическая структура данных, состоящая из узлов (вершин), соединённых рёбрами, в которой:
есть ровно один узел без родителя — корень,
любой другой узел имеет ровно одного родителя,
циклов нет (нельзя пройти по рёбрам и вернуться в тот же узел).
Основные понятия:
Степень узла — это количество его непосредственных потомков (детей).
Например: если у узла три ребёнка, его степень = 3.
Степень дерева — это максимальная степень среди всех его узлов.
То есть: смотрим на все узлы, находим у кого больше всего детей — это и есть степень всего дерева.
Высота дерева — это количество рёбер в самом длинном пути от корня до листа.
