- •1. Общая классификация структур.
- •4. Стек. Доступ к элементу стека, адресация элемента. Алгоритмы исключения и включения элемента стека. Варианты конкретной реализации стека.
- •5. Очереди. Алгоритмы включения, исключения элемента и очистки очереди. Конкретная реализация очереди.
- •10. Разреженные матрицы, примеры их использования. Методы обработки разреженных матриц.
- •11. Деревья. Виды деревьев и способы их представления.
- •12. Двоичные деревья. Обход двоичных деревьев. Двоичные деревья поиска (ддп). Алгоритмы поиска в ддп.
- •18. Пути в графах. Алгоритм поиска Эйлерова и Гамильтонова пути в графе.
- •15. Матричное и списковое представление графов.
- •16. Поиск путей в графах. Алгоритм поиска в глубину. Алгоритм поиска в ширину.
- •17. Алгоритм построения каркасов в графе.
4. Стек. Доступ к элементу стека, адресация элемента. Алгоритмы исключения и включения элемента стека. Варианты конкретной реализации стека.
Стек – динамическая структура, последовательный односвязный список, включение и исключение из которого происходят с одной стороны – вершины; вершина адресуется специальным указателем. Обрабатывается по принципу LastInFirstOut. Доступ к элементу стека происходит путём извлечения из него «верхнего» элемента, при этом указатель на вершину стека перемещается.
Стек может быть реализован вектором или списком. При реализации вектором выделяется сплошная область памяти под некоторое число элементов. Хранится индекс элемента, являющегося вершиной стека. При включении элемента индекс увеличивается, затем по указанному адресу в вектор заносится информация; при исключении элемента считывается информация по индексу, а индекс уменьшается.
При реализации стека списком, объём стека ограничен только объёмом доступной ОП. Вместо индекса хранится указатель на вершину стека, а каждый элемент имеет указатель на предыдущий. Процесс добавления и извлечения элементов происходит аналогичным образом, за исключением того что вместо инкремента и декремента индекса вершины меняется значение указателя на вершину.
5. Очереди. Алгоритмы включения, исключения элемента и очистки очереди. Конкретная реализация очереди.
Очередь – последовательный список переменной длины, включение в который идет с одной стороны (с хвоста), а исключение – с другой (с головы), FirstInFirstOut. Для хвоста и головы используют два указателя.
При реализации очереди в виде массива, в массив последовательно заносятся элементы. Может оказаться что выделенная память в начале окажется пустой, а в конце будет хвост с элементами. Если очередь обрабатывается быстрее, чем приходит, то память может оказаться свободна а следующий элемент включить будет нельзя. Нужно сдвигать элементы – однако на это тратится время, поэтому также можно сделать кольцевую очередь. В кольцевой структуре необходимо проверять количество элементов, однако сложнее реализуется добавление и исключение элементов.
При реализации очереди списком, при добавлении указатель «следующий» у последнего элемента устанавливается на новый элемент, а указатель конца перемещается на новый. При извлечении возвращается указатель на «головной» элемент, а указатель начала перемещается к следующему.
6. Двусвязный список. Алгоритм включения, исключения элемента из двусвязного списка. Многосвязные списки.
Двусвязный линейный список – совокупность элементов, содержащих данные и указатели на следующий и предыдущий элементы. Операции включения и исключения элемента из списка подразумевают работу с обоими указателями обрабатываемого элемента, и соответствующими указателями «связанных» с ним элементов.
Многосвязный список (например, дерево) – каждый элемент содержит произвольное число направленных связок с другими; с каждым элементом может связываться произвольное число других элементов; связки могут иметь не только направление но и вес (ребра графа).
7. Рекурсивные процедуры и функции. Критерии выбора для разработки рекурсивных или итеративных алгоритмов.
Рекурсивным называют объект, частично состоящий или же определенный с помощью самого себя. Функция рекурсивна, если в процессе работы она вызывает саму себя. Любая рекурсивная функция обязана содержать нерекурсивный выход для корректного окончания рекурсии.
Рекурсию следует применять для задач, где данные определяются в терминах рекурсий. Программы, в которых следует избегать рекурсии, можно охарактеризовать схемой: P === if B then S; P end P === S; if B then P end // P === [x:=0; while B do S end]. Где В – условие вызова рекурсии. Любой рекурсивный алгоритм можно свести к нерекурсивному – однако это может привести к его заметному сложнению как с точки зрения понятности, так и с точки зрения эффективности.
8. Рекурсивные типы данных. Примеры описаний и использования.
Рекурсивным называют объект, частично состоящий или же определенный с помощью самого себя. Рекурсивный тип данных содержит в описании указатель на элемент такого же типа, например:
struct List_el
{
int n;
List_el* next;
}
Рекурсивные типы данных могут быть использованы для создания списков или деревьев.
9. Понятие абстрактных типов данных. Обработка абстрактных типов данных (АТД). Принципы создания программ с использованием АТД.
Абстрактный тип данных (АТД) — это тип данных, который предоставляет для работы с элементами определённый набор функций. Вся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции. Абстрактный тип данных определяет набор функций, независимых от конкретной реализации типа, для оперирования его значениями.
В программировании абстрактные типы данных обычно представляются в виде интерфейсов, которые скрывают реализации конкретных типов. Программист работает с абстрактными типами данных исключительно через их интерфейсы, поскольку реализация может в будущем измениться. Такой подход соответствует принципу инкапсуляции в объектно-ориентированном программировании. Сильной стороной этой методики является именно сокрытие реализации. Раз вовне опубликован только интерфейс, то пока структура данных поддерживает этот интерфейс, все программы, работающие с заданной структурой абстрактным типом данных, будут продолжать работать.
Различие между абстрактными типами данных и структурами данных, которые реализуют абстрактные типы, можно пояснить на следующем примере. Абстрактный тип данных «список» может быть реализован при помощи массива или линейного списка, с использованием различных методов динамического выделения памяти. Однако каждая реализация определяет один и тот же набор функций, который должен работать одинаково (по результату, а не по скорости) для всех реализаций.
Абстрактные типы данных позволяют достичь модульности программных продуктов и иметь несколько альтернативных взаимозаменяемых реализаций отдельного модуля.
