
- •Билет №24. Основы анализа алгоритмов. Анализ сложности алгоритмов. Временная и емкостная сложность. Верхняя, нижняя и средняя оценки сложности. Примеры.
- •1. Понятие алгоритма и меры его сложности
- •2. Временная и емкостная сложность алгоритмов
- •3. Верхние и средние оценки сложности алгоритмов
- •Билет №25. Общий алгоритм вида «Разделяй и властвуй». Анализ сложности рекурсивного алгоритма. Примеры.
- •Билет №26. Нижняя оценка сложности алгоритма. Сложность задачи. Примеры: сортировки массивов.
- •Билет №27. Аналогии между методами построения алгоритмов и методами построения данных. Данные со статической и динамической структурой. Примеры.
- •Билет №30. Алгоритм интерполяционного поиска в списке. Анализ сложности алгоритма.
- •Билет №35. Данные со статической структурой. Алгоритм быстрой сортировки Хоара. Анализ сложности алгоритма.
- •Int data; /* некие данные */
- •Билет №38. Данные с динамической структурой. Линейные списки. Схематическое представление основных операций. Сложность основных операций.
- •Билет №39. Этапы разработки программ с использованием технологии структурного программирования.
Билет №30. Алгоритм интерполяционного поиска в списке. Анализ сложности алгоритма.
Интерполирующий поиск основан на принципе поиска в телефонной книге или, например, в словаре. Вместо сравнения каждого элемента с искомым как при линейном поиске, данный алгоритм производит предсказание местонахождения элемента: поиск происходит подобно двоичному поиску, но вместо деления области поиска на две части, интерполирующий поиск производит оценку новой области поиска по расстоянию между ключом и текущим значением элемента. Другими словами, бинарный поиск учитывает лишь знак разности между ключом и текущим значением, а интерполирующий ещё учитывает и модуль этой разности и по данному значению производит предсказание позиции следующего элемента для проверки. В среднем, интерполирующий поиск производит log(log(N)) операций, где N есть число элементов, среди которых производится поиск. Число необходимых операций зависит от равномерности распределения значений среди элементов. В плохом случае (например, когда значения элементов экспоненциально возрастают) интерполяционный поиск может потребовать до O(N) операций.
Анализ сложности – Королев-Миков страницы 122!!!
Билет №31. Данные со статической структурой. Алгоритм сортировки массива вставками. Анализ сложности алгоритма.
Сортировка вставками.
На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированном списке, до тех пор, пока набор входных данных не будет исчерпан. Метод выбора очередного элемента из исходного массива произволен; может использоваться практически любой алгоритм выбора. Обычно (и с целью получения устойчивого алгоритма сортировки), элементы вставляются по порядку их появления во входном массиве.
Сказанное можно записать следующим образом в псевдокоде:
Начало цикла для j от 2 до N переместить M[j] на позицию i <= j такую, что M[j] < M[k] для i<= k < j и либо M[j] >= M[i-1], либо i=1 конец цикла
Время выполнения алгоритма зависит от входных данных: чем большее множество нужно отсортировать, тем большее время выполняется сортировка. Также на время выполнения влияет исходная упорядоченность массива. Так, лучшим случаем является отсортированный массив, а худшим — массив, отсортированный в порядке, обратном нужному. Временная сложность алгоритма при худшем варианте входных данных — θ(n²).
Анализ сложности – Королев-Миков страницы 122!!!
Билет №32. Данные со статической структурой. Алгоритм сортировки массива выбором. Анализ сложности алгоритма.
Шаги алгоритма:
находим номер минимального значения в текущем списке
производим обмен этого значения со значением первой неотсортированной позиции (обмен не нужен, если минимальный элемент уже находится на данной позиции)
теперь сортируем хвост списка, исключив из рассмотрения уже отсортированные элементы
Для реализации устойчивости алгоритма необходимо в пункте 2 минимальный элемент непосредственно вставлять в первую неотсортированную позицию, не меняя порядок остальных элементов.
Сказанное можно записать следующим образом в псевдокоде:
Нц для j от 1 до N-1 выбрать среди M[j],. . ., M[N] наименьший элемент и поменять его местами с M[j] кц
Так как после каждого прохода по внутреннему циклу делается только один обмен, то общее число обменов равно N-1, что в N/2 раз меньше, чем в сортировке пузырьком. Число проходов по внутреннему циклу равно N-1 даже в случае сортировки частично или полностью отсортированного массива. Наихудший случай: Число сравнений в теле цикла равно (N-1)*N/2. Число сравнений в заголовках циклов (N-1)*N/2. Число сравнений перед операцией обмена N-1. Суммарное число сравнений N2−1. Число обменов N-1.
Анализ сложности – Королев-Миков страницы 122!!!
Билет №33. Данные со статической структурой. Алгоритм сортировки массива обменом. Анализ сложности алгоритма.
Пузырьковая сортировка.
Алгоритм состоит в повторяющихся проходах по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает — массив отсортирован. При проходе алгоритма, элемент, стоящий не на своём месте, «всплывает» до нужной позиции как пузырёк в воде, отсюда и название алгоритма.
Для понимания и реализации этот алгоритм — простейший, но эффективен он лишь для небольших массивов. Сложность алгоритма: O(n²).
При первом проходе вдоль массива, начиная проход "снизу", берется первый элемент и поочередно сравнивается с последующими. При этом:
если встречается более "легкий" (с меньшим значением) элемент, то они меняются местами;
при встрече с более "тяжелым" элементом, последний становится "эталоном" для сравнения, и все следующие сравниваются с ним .
В результате наибольший элемент оказывается в самом верху массива.
Псевдокод.
ЦИКЛ ДЛЯ J=1 ДО N-1 ШАГ 1 FOR J=1 TO N-1 STEP 1
ЦИКЛ ДЛЯ I=1 ДО N-J ШАГ 1 FOR I=1 TO N-J STEP 1
ЕСЛИ A[I]>A[I+1] ТО ОБМЕН A[I],A[I+1] IF A[I]>A[I+1] THEN SWAP A[I],A[I+1]
СЛЕДУЮЩЕЕ I NEXT I
СЛЕДУЮЩЕЕ J NEXT J
Билет №34. Данные со статической структурой. Алгоритм сортировки массива слиянием. Анализ сложности алгоритма
Алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке.
Сортируемый массив разбивается на две части примерно одинакового размера;
Каждая из получившихся частей сортируется отдельно, например — тем же самым алгоритмом;
Два упорядоченных массива половинного размера соединяются в один.
Рекурсивное разбиение задачи на меньшие происходит до тех пор, пока размер массива не достигнет единицы (любой массив длины 1 можно считать упорядоченным).
Псевдокод алгоритма слияния без "прицепления" остатка на C++-подобном языке:
L = *In1;
R = *In2;
if( L == R )
{
*Out++ = L;
In1++;
*Out++ = R;
In2++;
}
else if( L < R )
{
*Out++ = L;
In1++;
}
else
{
*Out++ = R;
In2++;
}
Анализ сложности – Королев-Миков страницы 122!!!