Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Колок.docx
Скачиваний:
2
Добавлен:
26.11.2019
Размер:
77.28 Кб
Скачать
  1. Атд "Очередь с приоритетом"

    • Чем отличаются понятия "абстрактный тип данных (АТД)" и "структура данных"

    • Опишите абстрактный тип данных "Очередь с приоритетом"

    • Опишите структуру данных "Двоичная куча"

    • Оцените среднее и худшее время выполнения операций

    • Приведите примеры задач, в которых естественно использовать АТД "Очередь с приоритетом"

    • Можно ли реализовать АТД "Очередь с приоритетом" на базе реализации сбалансированного дерева поиска?

Абстра́ктный тип да́нных — это тип данных, который предоставляет для работы определённый набор функций. Вся внутренняя структура такого типа спрятана от разработчика программного.

Конкретные реализации АТД называются структурами данных.

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

Различие между абстрактными типами данных и структурами данных, которые реализуют абстрактные типы, можно пояснить на следующем примере. Абстрактный тип данных список может быть реализован при помощи структуры данных массив или линейный список. Однако каждая реализация определяет один и тот же набор функций, который должен работать одинаково для всех реализации.

Очередь с приоритетом — абстрактный тип данных в программировании поддерживающий три операции:

  1. Добавить в очередь элемент с назначенным приоритетом

  2. Извлечь из очереди и вернуть элемент с минимальным приоритетом

  3. (необязательная операция) Просмотреть элемент с наивысшим приоритетом без извлечения

Двои́чная ку́ча, пирами́да — такое двоичное дерево, для которого выполнены три условия:

  1. Значение в любой вершине не меньше, чем значения её потомков.

  2. Каждый лист имеет расстояние до корня либо d либо d-1. Иными словами, если назвать слоем совокупность вершин, находящихся на определённой глубине, то все слои, кроме, быть может, последнего, заполнены полностью.

  3. Последний слой заполняется слева направо.

Над кучей можно выполнять следующие операции:

• Добавить элемент в кучу. Сложность O(logn)

• Исключить максимальный элемент из кучи. Время работы O(logn)

• Изменить значение любого элемента. Время работы O(logn)

В качестве примера очереди с приоритетом можно рассмотреть список задач работника. Когда он заканчивает одну задачу, он переходит к очередной — самой приоритетной (ключ будет величиной, обратной приоритету) — то есть выполняет операцию EXTRACT_MIN.

Начальник добавляет задачи в список, указывая их приоритет, то есть выполняет операцию INSERT.

Да. Для поиска элемента с максимальным приоритетом следует взять самый левый нижний элемент сбалансированного дерева поиска.

  1. Поразрядная сортировка

    • Какие предположения о типе данных требуются?

    • Какие виды поразрядной сортировки известны?

    • Расскажите алгоритм.

    • Какова его сложность?

В поразрядной сортировке предполагается, что сортируются целочисленные типы данных или типы данных, которые приводятся к таковым.

MSD – сначала сортируются более младшие разряды, а потом старшие LSD – наоборот.

На каждой итерации алгоритм включает 2 этапа: распределение и сборка. Если мы сортируем числа, то количество разрядов будет равно количеству десятичных разрядов этого числа, например: 27 - количество разрядов 2, 487 - количество разрядов 3. В случае сортировки текстовых строк количество разрядов будет определяться количеством букв в строке.

Перед сортировкой необходимо определить 2 величины:

  1. width - максимальное количество разрядов в сортируемых величинах, по-другому - количество разрядов в самом длинном ключе ("ключ" = сортируемый элемент).

  2. range - количество возможных значений одного разряда ключа(сортируемого элемента). Т.е. для десятичных чисел очевидно имеем - 10, для строки это будет соответственно количество букв в алфавите.

Сам алгоритм работает следующим образом. Создаются range вспомогательных списков - "карманов", т.е. на каждое возможное значение разряда элемента - по карману, т.е. по списку. Далее - первый этап распределение по карманам и на первом проходе элементы исходной последовательности помещаются в эти карманы (списки) по их младшему разряду, т.е. по самому правому числу. Какой этот самый младший разряд у элемента, в такой карман этот элемент и помещается.

Например, пусть имеем исходную последовательность из {11, 24, 9, 59, 21, 98, 76, 8}, для которой определяем width = 2, range = 10, поэтому будет 10 "карманов". Тогда на первом проходе карманы распределят элементы след. образом: список0: 9, 8 список1: 11, 21 список4: 24 список6: 76 список8: 98 список9: 59

Далее второй этап - сборка: просто последовательно соединяем один за другим все карманы и располагаем элементы уже в этой последовательности.

На следующем проходе, элементы из уже обновленной последовательности распределяются по карманам в соответствии с их вторым разрядом и т.д до самого старшего, максимального, width-го разряда ключа.

O(k·n) для n элементов, которые имеют не более k знаков.