Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

РГР_сиакод

.docx
Скачиваний:
15
Добавлен:
31.03.2021
Размер:
43.11 Кб
Скачать

ФГБОУ ВО

Уфимский Государственный Авиационный Технический Университет

Кафедра ВМиК

Пояснительная записка к расчетно-графической работе

по дисциплине

«Структуры и алгоритмы компьютерной обработки данных»

Выполнил:

студент группы МО-217

Шакиров Айдар Рушанович

Проверила:

Канд. техн. наук, доцент

Верхотурова Галина Николаевна

Уфа 2020

Постановка задачи

Задана последовательность из n элементов. Найти медиану для этих n элементов. Медианой для n элементов называется элемент, меньший (или равный) половине из n элементов и больший (равный) другой половине из n элементов.

Алгоритм нахождения медианы

Данную проблему можем решить с помощью алгоритма нахождения k‑й порядковой статистики. Так как нужно найти медиану, то k = n / 2.

Выбирается опорный элемент – центр текущей последовательности. Последовательность разбивается на две части относительно опорного элемента – в одну часть попадают элементы, меньшие, чем выбранного, в другую – остальные. По окончании опорный элемент окажется на j позиции.

Если в первой части оказалось j=k-1 элементов, то выбранный центральный элемент является искомым, если j>k, то алгоритм выполняется рекурсивно для первой части массива, иначе – для второй.

  1. Вводим число n – количество элементов последовательности.

  2. Генерируется массив значений размерности n.

  3. Задаем индекс k-й статистики = n / 2, т.е. номер середины массива.

  4. Задаем индекс левой и правой границы массива.

  5. Пока индекс левой границы меньше правой

    1. Задаем опорный элемент равной значению центра массива.

    2. Задаем i равной левой границе.

    3. Задаем j равной правой границе.

    4. Пока i<=j

      1. Пока значение i элемента меньше опорного,

то увеличиваем i на единицу.

      1. Пока значение j элемента больше опорного,

то уменьшаем j на единицу.

      1. Если i<=j, то

        1. Меняем местами i и j элементы.

        2. Увеличиваем i на единицу.

        3. Уменьшаем j на единицу.

    1. Если j<k,

То левая граница = i

    1. Если i>k,

То правая граница = j

  1. Вывод центрального элемента массива.

Входные данные:

  • 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 с.