
- •Билет №24. Основы анализа алгоритмов. Анализ сложности алгоритмов. Временная и емкостная сложность. Верхняя, нижняя и средняя оценки сложности. Примеры.
- •1. Понятие алгоритма и меры его сложности
- •2. Временная и емкостная сложность алгоритмов
- •3. Верхние и средние оценки сложности алгоритмов
- •Билет №25. Общий алгоритм вида «Разделяй и властвуй». Анализ сложности рекурсивного алгоритма. Примеры.
- •Билет №26. Нижняя оценка сложности алгоритма. Сложность задачи. Примеры: сортировки массивов.
- •Билет №27. Аналогии между методами построения алгоритмов и методами построения данных. Данные со статической и динамической структурой. Примеры.
- •Билет №30. Алгоритм интерполяционного поиска в списке. Анализ сложности алгоритма.
- •Билет №35. Данные со статической структурой. Алгоритм быстрой сортировки Хоара. Анализ сложности алгоритма.
- •Int data; /* некие данные */
- •Билет №38. Данные с динамической структурой. Линейные списки. Схематическое представление основных операций. Сложность основных операций.
- •Билет №39. Этапы разработки программ с использованием технологии структурного программирования.
Int data; /* некие данные */
};
Рекурсивная структура данных зачастую обуславливает применение рекурсии для обработки этих данных.
Билет №38. Данные с динамической структурой. Линейные списки. Схематическое представление основных операций. Сложность основных операций.
Линейный однонаправленный список — это структура данных, состоящая из элементов одного типа, связанных между собой.
В информатике линейный список обычно определяется как абстрактный тип данных (АТД), формализующий понятие упорядоченной коллекции данных.
На практике линейные списки обычно реализуются при помощи массивов и связных списков. Иногда термин «список» неформально используется также как синоним понятия «связный список».
К примеру, АТД нетипизированного изменяемого списка может быть определён как набор из конструктора и четырёх основных операций:
операция, проверяющая список на пустоту;
операция добавления объекта в список;
операция определения первого (головного) элемента списка;
операция доступа к списку, состоящему из всех элементов исходного списка, кроме первого.
Характеристики
Длина списка. Количество элементов в списке.
Списки могут быть типизированными или нетипизированными. Если список типизирован, то тип его элементов задан, и все его элементы должны иметь типы, совместимые с заданным типом элементов списка. Обычно списки, реализованные при помощи массивов, являются типизированными.
Список может быть сортированным или несортированным
В зависимости от реализации может быть возможен произвольный доступ к элементам списка.
Линейный
список (linear list) — это
множество, состоящее из
узлов
,
структурные свойства которого по сути
ограничиваются лишь линейным (одномерным)
относительным положением узлов, т. е.
теми условиями, что если
,
то
является
первым узлом; если
, то
k-му узлу
предшествует
и
за ним следует
;
является
последним узлом.
Операции,
которые мы имеем право выполнять с
линейными списками, включают, например,
следующие:
1. Получить
доступ к k-му узлу списка, чтобы
проанализировать и/или изменить
содержимое его полей.
2. Включить
новый узел непосредственно перед k-ым
узлом.
3. Исключить
k-й узел.
4. Объединить
два (или более) линейных списка в один
список.
5. Разбить
линейный список на два (или более)
списка.
6. Сделать
копию линейного списка.
7. Определить
количество узлов в списке.
8. Выполнить
сортировку узлов списка в возрастающем
порядке по некоторым полям в
узлах.
9. Найти
в списке узел с заданным значением в
некотором поле.
Билет №39. Этапы разработки программ с использованием технологии структурного программирования.
Структурное программирование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70-х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом.
В соответствии с данной методологией
Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:
последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;
ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;
цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).
В программе базовые конструкции могут быть вложены друг в друга произвольным образом, но никаких других средств управления последовательностью выполнения операций не предусматривается.
Повторяющиеся фрагменты программы (либо не повторяющиеся, но представляющие собой логически целостные вычислительные блоки) могут оформляться в виде т. н. подпрограмм(процедур или функций). В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция вызова подпрограммы. При выполнении такой инструкции выполняется вызванная подпрограмма, после чего исполнение программы продолжается с инструкции, следующей за командой вызова подпрограммы.
Разработка программы ведётся пошагово, методом «сверху вниз».
Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент. Вместо настоящих, работающих подпрограмм, в программу вставляются «заглушки», которые ничего не делают. Полученная программа проверяется и отлаживается. После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (то есть общая структура программы верна), подпрограммы-заглушки последовательно заменяются на реально работающие, причём разработка каждой подпрограммы ведётся тем же методом, что и основной программы. Разработка заканчивается тогда, когда не останется ни одной «затычки», которая не была бы удалена. Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов, и может быть уверен, что общая структура всех более высоких уровней программы верна. При сопровождении и внесении изменений в программу выясняется, в какие именно процедуры нужно внести изменения, и они вносятся, не затрагивая части программы, непосредственно не связанные с ними. Это позволяет гарантировать, что при внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы, находящаяся в данный момент вне зоны внимания программиста.