Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

11.4. Наборы и Структуры Союза/Находить 541

2

2

53 6 5

3 6

8 10

9 8 10

9

11

11

12

12

(a) (b)

Рисунок 11.18: основанное на дереве внедрение разделения: (a) операционный союз (A, B); (b) операция находят (p), где p обозначает объект положения для элемента 12.

Сжатие пути: В операции по находке, для каждого узла v, который находка посещает, сброс

родительский указатель от v, чтобы указать на корень. (См. рисунок 11.19.)

2

2

5

5 3 6

3 6

8 10

8 10

9

9

11

11

12 12

(a) (b)

Рисунок 11.19: эвристическое сжатие пути: (a) путь, пересеченный операцией, находят на элементе 12; (b) реструктурированное дерево.

Удивительная собственность этой структуры данных, осуществлено используя союз - размером и эвристика сжатия пути, состоит в том, что выполнение серии n союза и находит, что операции берут O (n регистрация* n) время, где регистрация* n является функцией звезды регистрации, которая является инверсией функции башни пар. Интуитивно, регистрация* n является количеством раз, что можно многократно взять логарифм (базируйтесь 2) числа прежде, чем получить число, меньшее, чем 2. Таблица 11.1 показывает несколько типовых ценностей.

2 22

Минимум n 2 22 = 4 2 22 = 1 6 2 22 = 6 5, 5 3 6 2 22 = 265,536

зарегистрируйтесь* n 1 2 3 4 5

Таблица 11.1: Некоторые значения регистрации* n и критические значения для ее инверсии.

542 Глава 11. Сортировка, наборы и выбор

11.5 Выбор

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

Определение проблемы выбора

В этой секции мы обсуждаем общую статистическую заказом проблему отбора kth самого маленького элемента от несортированной коллекции n сопоставимых элементов. Это известно как проблема выбора. Конечно, мы можем решить эту проблему, сортировав

коллекция и затем вносящий в указатель в сортированную последовательность в индексе k - 1. Используя

лучшие основанные на сравнении алгоритмы сортировки, этот подход взял бы O (n, регистрируют n),

время, которое является, очевидно, излишеством для случаев где k = 1 или k = n (или даже

k = 2, k = 3, k = n- 1 или k = n- 5), потому что мы можем легко решить выбор

проблема для этих ценностей k в O (n) время. Таким образом естественный вопрос спросить

можем ли мы достигнуть O (n) продолжительность для всех ценностей k (включая

интересный случай нахождения медианы, где k =n/2 ⌋).

11.5.1 Слива-и-поиск

Это может стать маленьким удивлением, но мы можем действительно решить проблему выбора в O (n) время для любой ценности k. Кроме того, техника, которую мы используем, чтобы достигнуть этого результата, включает интересный алгоритмический шаблон. Этот шаблон известен как слива-и-поиск или уменьшать-и-побеждать. В применении этого шаблона мы решаем данную проблему, которая определена на коллекции объектов n, сократив далеко часть объектов n и рекурсивно решив меньшую проблему. Когда мы наконец уменьшили проблему до одного определенного на коллекции постоянного размера объектов, тогда мы решаем проблему, используя некоторый метод «в лоб». Возвращение назад из всех рекурсивных вызовов заканчивает строительство. В некоторых случаях мы можем избегать использования рекурсии, когда мы просто повторяем шаг сокращения сливы-и-поиска, пока мы не можем применить метод «в лоб» и остановку. Случайно, метод двоичного поиска, описанный в Разделе 9.3.1, является примером сливы «шаблона поиска и».