РГР_сиакод
.docxФГБОУ ВО
Уфимский Государственный Авиационный Технический Университет
Кафедра ВМиК
Пояснительная записка к расчетно-графической работе
по дисциплине
«Структуры и алгоритмы компьютерной обработки данных»
Выполнил:
студент группы МО-217
Шакиров Айдар Рушанович
Проверила:
Канд. техн. наук, доцент
Верхотурова Галина Николаевна
Уфа 2020
Постановка задачи
Задана последовательность из n элементов. Найти медиану для этих n элементов. Медианой для n элементов называется элемент, меньший (или равный) половине из n элементов и больший (равный) другой половине из n элементов.
Алгоритм нахождения медианы
Данную проблему можем решить с помощью алгоритма нахождения k‑й порядковой статистики. Так как нужно найти медиану, то k = n / 2.
Выбирается опорный элемент – центр текущей последовательности. Последовательность разбивается на две части относительно опорного элемента – в одну часть попадают элементы, меньшие, чем выбранного, в другую – остальные. По окончании опорный элемент окажется на j позиции.
Если в первой части оказалось j=k-1 элементов, то выбранный центральный элемент является искомым, если j>k, то алгоритм выполняется рекурсивно для первой части массива, иначе – для второй.
Вводим число n – количество элементов последовательности.
Генерируется массив значений размерности n.
Задаем индекс k-й статистики = n / 2, т.е. номер середины массива.
Задаем индекс левой и правой границы массива.
Пока индекс левой границы меньше правой
Задаем опорный элемент равной значению центра массива.
Задаем i равной левой границе.
Задаем j равной правой границе.
Пока i<=j
Пока значение i элемента меньше опорного,
то увеличиваем i на единицу.
Пока значение j элемента больше опорного,
то уменьшаем j на единицу.
Если i<=j, то
Меняем местами i и j элементы.
Увеличиваем i на единицу.
Уменьшаем j на единицу.
Если j<k,
То левая граница = i
Если i>k,
То правая граница = j
Вывод центрального элемента массива.
Входные данные:
array - массив элементов последовательности
n – количество элементов последовательности.
Выходные данные
result – значение медианы последовательности.
Реализация
O(n)
O(n)
O(n)
O(n2)
def find_sorted(array, k): """ Алгоритм выбора :param array: массив :param k: номер по величине элемента в массиве :return: значение номера по величине элемента в массиве """ # определяем границы области left = 0 right = len(array) - 1 # пока область не пуста while left < right: # опорное значение pivot = array[k] i = left j = right while i <= j: # ищем индекс значения больше опорного от левого края while array[i] < pivot: i += 1 # ищем индекс значения меньше опорного от правого края while array[j] > pivot: j -= 1 if i <= j: # меняем местами эти значения array[i], array[j] = array[j], array[i] # продолжаем просмотр i += 1 j -= 1 if j < k: left = i if i > k: right = j
result = array[k] return result
где,
k – номер k-й порядковой статистики (в случае медианы k =n/2).
left – индекс левой границы области.
right – индекс правой границы области.
pivot – значение опорного элемента
i – индекс элемента во время обхода с левой границы области.
j – индекс элемента во время обхода с правой границы области.
Оценка сложности:
Рекурсивные вызовы приводят к экспоненциально уменьшающемуся с каждой итерацией размеру обрабатываемого массива, и по этой причине время выполнения алгоритма в среднем составляет O(n).
Однако в худшем случае каждый шаг разбиения уменьшает размер области только на единицу, поэтому требуется порядок сравнений n2.
Список литературы:
1. Вирт, Н. Алгоритмы и структуры данных. Новая версия для Оберона : учебное пособие / Н. Вирт. — Москва : ДМК Пресс, 2010. — 272 с.
2. Златопольский, Д.М. Основы программирования на языке Python / Д.М. Златопольский. — 2-ое изд., испр. и доп. — Москва : ДМК Пресс, 2018. — 396 с.