В информатике, сети компараторов представляют собой абстрактные устройства, состоящие из фиксированного числа «проводов», переносящих значения и компаратора модули, которые соединяют пары проводов, меняя местами значения на проводах, если они расположены не в желаемом порядке. Такие сети обычно предназначены для выполнения сортировки по фиксированному количеству значений, и в этом случае они называются сетями сортировки .
Сети сортировки отличаются от обычных сортировок сравнения тем, что они не способны обрабатывать произвольно большие входные данные, и их последовательность сравнений задается заранее, независимо от результата предыдущих сравнений. Для сортировки большего количества входов необходимо построить новые сети сортировки. Эта независимость сравнительных последовательностей полезна для параллельного выполнения и для реализации в аппаратном обеспечении. Несмотря на простоту сортировочных сетей, их теория на удивление глубока и сложна. Сортировочные сети были впервые изучены примерно в 1954 году Армстронгом, Нельсоном и О'Коннором, которые впоследствии запатентовали эту идею.
Сортировочные сети могут быть реализованы либо в аппаратном обеспечении, либо в программном обеспечении. Дональд Кнут описывает, как компараторы для двоичных целых чисел могут быть реализованы в виде простых электронных устройств с тремя состояниями. Батчер в 1968 году предложил использовать их для построения коммутационных сетей для компьютерного оборудования, заменив обе шины и более быстрые, но более дорогие переключатели с перекладиной. С 2000-х годов сети сортировки (особенно bitonic mergesort ) используются сообществом GPGPU для построения алгоритмов сортировки для работы на графических процессорах.
Сортировочная сеть состоит из двух типов элементов: компараторов и проводов. Считается, что провода проходят слева направо, передавая значения (по одному на провод), которые проходят через сеть одновременно. Каждый компаратор соединяет два провода. Когда пара значений, проходящая через пару проводов, встречает компаратор, компаратор меняет местами значения тогда и только тогда, когда значение верхнего провода больше или равно значению нижнего провода.
В формуле, если верхний провод несет x, а нижний провод несет y, то после попадания в компаратор провода несут и соответственно, поэтому пара значений отсортирована. Сеть проводов и компараторов, которая будет правильно сортировать все возможные входы в порядке возрастания, называется сетью сортировки или хабом Краскала. Отражая сеть, также можно отсортировать все входные данные в порядке убывания.
Полная работа простой сортировочной сети показана ниже. Очевидно, почему эта сортировочная сеть будет правильно сортировать входы; обратите внимание, что первые четыре компаратора «опускают» наибольшее значение вниз и «перемещают» наименьшее значение вверх. Последний компаратор перебирает два средних провода.
Эффективность сортировочной сети можно измерить по ее общему размеру, то есть по количеству компараторов в сети, или по ее глубине, определяемой (неформально) как наибольшее количество компараторов что любое входное значение может встретиться на своем пути по сети. Отметив, что сети сортировки могут выполнять определенные сравнения параллельно (представленные в графическом обозначении компараторами, расположенными на одной вертикальной линии), и предполагая, что все сравнения выполняются за единицу времени, можно видеть, что глубина сеть равна количеству временных шагов, необходимых для ее выполнения.
Мы можем легко построить сеть любого размера рекурсивно, используя принципы вставки и выбора. Предполагая, что у нас есть сортировочная сеть размера n, мы можем построить сеть размером n + 1, «вставив» дополнительный номер в уже отсортированную подсеть (используя принцип, лежащий в основе insert sort ). Мы также можем сделать то же самое, сначала «выбрав» наименьшее значение из входных данных, а затем рекурсивно отсортировав оставшиеся значения (используя принцип пузырьковой сортировки ).
Сеть сортировки, построенная рекурсивно, которая сначала опускает наибольшее значение в снизу, а затем сортирует оставшиеся провода. На основе пузырьковой сортировкисеть сортировки, построенная рекурсивно, которая сначала сортирует первые n проводов, а затем вставляет оставшееся значение. На основе сортировка вставкой |
Структура этих двух сетей сортировки очень схожа. Конструкция двух разных вариантов, которая объединяет компараторы, которые могут выполняться одновременно, показывает, что на самом деле они идентичны.
Сеть пузырьковой сортировки | Сеть сортировки вставкой | При использовании параллельных компараторов пузырьковая сортировка и сортировка вставкой идентичны |
Сеть вставки (или, что эквивалентно, пузырьковая сеть) имеет глубину 2n - 3, где n - количество значений. Это лучше, чем O (n log n) время, необходимое машинам с произвольным доступом, но оказывается, что существуют гораздо более эффективные сети сортировки с глубиной всего O (log n), как описано ниже.
Хотя доказать правильность некоторых сетей сортировки (например, вставки / пузырькового сортировщика) несложно, это не всегда так просто. Нет! перестановки чисел в n-проводной сети, и для их проверки потребуется значительное количество времени, особенно когда n велико. Количество тестовых примеров можно значительно сократить до 2, используя так называемый принцип нуля или единицы. Хотя он все еще экспоненциальный, он меньше n! для всех n ≥ 4, и разница довольно быстро растет с увеличением n.
Принцип нуля или единицы гласит, что если сеть сортировки может правильно отсортировать все 2 последовательности нулей и единиц, то он также действителен для произвольно упорядоченных входных данных. Это не только резко сокращает количество тестов, необходимых для проверки достоверности сети, но и очень полезно при создании множества конструкций сетей сортировки.
Принцип может быть доказан, сначала наблюдая следующий факт о компараторах: когда монотонно возрастающая функция применяется к входам, то есть x и y заменяются на f (x) и f (y), то компаратор выдает min (f (x), f (y)) = f (min (x, y)) и max (f (x), f (y)) = f (max ( х, у)). Посредством индукции по глубине сети этот результат может быть расширен до леммы, утверждающей, что если сеть преобразует последовательность a 1,..., a n в b 1,..., b n, он преобразует f (a 1),..., f (a n) в f (b 1),..., f (b n). Предположим, что некоторые входные данные a 1,..., a n содержат два элемента a i< aj, и сеть неправильно меняет местами их на выходе. Тогда он также будет неправильно отсортировать f (a 1),..., f (a n) для функции
Эта функция является монотонной, поэтому у нас есть принцип нуля или единицы в качестве противоположных.
Существуют различные алгоритмы для построения сетей сортировки глубины O (log n) (отсюда размер O (n log n)), такие как Сортировка слиянием нечетных и четных дозаторов, битонная сортировка, Сортировка оболочки и Сеть попарной сортировки. Эти сети часто используются на практике.
Также возможно построение сетей глубины O (log n) (отсюда размер O (n log n)) с использованием конструкции, называемой сетью AKS, в честь ее первооткрывателей Ajtai, Komlós и Szemerédi. открытие, сеть AKS имеет очень ограниченный практический приложение из-за большой линейной константы, скрытой обозначением Big-O. Отчасти это связано с построением графа-расширителя .
Упрощенная версия сети AKS была описана Патерсоном в 1990 году, который отметил, что «константы, полученные для границы глубины, все еще не позволяют конструкция имеет практическую ценность ».
Более новая конструкция, называемая зигзагообразной сортировочной сетью размера O (n log n), была обнаружена Гудрич в 2014 году. Хотя ее размер составляет намного меньше, чем у сетей AKS, его глубина O (n log n) делает его непригодным для параллельной реализации.
Для небольшого фиксированного числа входов n можно построить оптимальные сети сортировки либо с минимальной глубиной (для максимально параллельного выполнения), либо с минимальным размером (количество компараторов). Эти сети могут использоваться для повышения производительности более крупных сетей сортировки, возникающих в результате рекурсивных конструкций, например, Batcher, путем ранней остановки рекурсии и вставки оптимальных сетей в качестве базовых случаев. В следующей таблице приведены результаты оптимальности для небольших сетей, для которых известна оптимальная глубина:
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Глубина | 0 | 1 | 3 | 3 | 5 | 5 | 6 | 6 | 7 | 7 | 8 | 8 | 9 | 9 | 9 | 9 | 10 |
Размер, верхняя граница | 0 | 1 | 3 | 5 | 9 | 12 | 16 | 19 | 25 | 29 | 35 | 39 | 45 | 51 | 56 | 60 | 71 |
Размер, нижняя граница (если отличается) | 43 | 47 | 51 | 55 | 60 |
Для более крупных сетей ни оптимальная глубина, ни оптимальный размер в настоящее время неизвестны. Известные на данный момент границы представлены в таблице ниже:
n | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Глубина, верхняя граница | 11 | 11 | 11 | 12 | 12 | 12 | 12 | 13 | 13 | 14 | 14 | 14 | 14 | 14 | 14 |
Глубина, нижняя граница | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 |
Размер, верхняя граница | 77 | 85 | 91 | 100 | 107 | 115 | 120 | 132 | 139 | 150 | 155 | 165 | 172 | 180 | 185 |
Размер, нижняя граница | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 |
.
Первые шестнадцать сетей с оптимальной глубиной перечислены в книге Кнута Искусство компьютерного программирования, начиная с издания 1973 года; однако, хотя оптимальность первых восьми была установлена Флойдом и Кнутом в 1960-х годах, это свойство не было доказано для последних шести до 2014 года (дела девять и десять были решены в 1991 году).
Для от одного до одиннадцати входов известны минимальные (т. Е. Оптимальные по размеру) сети сортировки, а для более высоких значений нижние границы их размеров S (n) могут быть получены индуктивно с использованием леммы Ван Вурхиса ( стр. 240): S (n) ≥ S (n - 1) + ⌈log 2 n⌉. Первые десять оптимальных сетей были известны с 1969 года, причем первые восемь снова были известны как оптимальные со времен работы Флойда и Кнута, но оптимальность случаев n = 9 и n = 10 требовала до 2014 года. Оптимальная сеть для размера 11 была найдена в декабре 2019 года Яннисом Хардером, который также сделал нижнюю границу для 12 совпадающей с верхней границей.
Некоторая работа по проектированию оптимальной сети сортировки была выполнена с использованием генетического алгоритмы : Д. Кнут упоминает, что наименьшая известная сеть сортировки для n = 13 была обнаружена Хьюгом Жюилле в 1995 г. «путем моделирования эволюционного процесса генетического разведения» (стр. 226), и что сети сортировки минимальной глубины для n = 9 и n = 11 были обнаружены Лорен Швиберт в 2001 году «с использованием генетических методов» (стр. 229).
Маловероятно, что дальнейшие существенные улучшения могут быть сделаны для тестирования сетей общей сортировки, если только P = NP, потому что проблема проверки того, действительно ли сеть-кандидат - это сеть сортировки, известная как co-NP - завершенная.