Сеть Бетчера — различия между версиями
Murtaught (обсуждение | вклад) м |
Murtaught (обсуждение | вклад) м (Теги <b> и <i> заменены на вики-разметку) |
||
| Строка 1: | Строка 1: | ||
| − | + | '''Сеть Бетчера ''(Batcher bitonic mergesort)''''' {{---}} сортирующая сеть размером <tex>O(n \log^2n)</tex> и глубиной <tex>O(\log^2n)</tex>, где <tex>n</tex> {{---}} количество элементов для сортировки. Её авторство принадлежит [http://en.wikipedia.org/wiki/Ken_Batcher Кену Бетчеру]. <br> | |
В этой статье будет описана сортирующая сеть для случая когда <tex>n</tex> {{---}} степень двойки (<tex>n = 2^k</tex>). | В этой статье будет описана сортирующая сеть для случая когда <tex>n</tex> {{---}} степень двойки (<tex>n = 2^k</tex>). | ||
| Строка 6: | Строка 6: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
| − | + | '''Битонической последовательностью ''(bitonic sequence)''''' называется числовая последовательность, которая сначала монотонно возрастает, а затем монотонно убывает, или последовательность, которая приводится к такому виду путем циклического сдвига.}} | |
Здесь мы воспользуемся [[0-1 принцип|0-1 принципом]] и будем рассматривать только нуль-единичные битонические последовательности: | Здесь мы воспользуемся [[0-1 принцип|0-1 принципом]] и будем рассматривать только нуль-единичные битонические последовательности: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
| − | + | '''Нуль-единичные битонические последовательности''' {{---}} последовательности вида <tex>0^i1^j0^k</tex> или <tex>1^i0^j1^k</tex> для целых <tex>i,j,k\ge0</tex>, где <tex>1^i</tex> или <tex>0^i</tex> обозначает <tex>i</tex> идущих подряд единиц или нулей соответственно.}} | |
В качестве примеров нуль-единичной битонической последовательности можно привести последовательности <tex>00111000</tex>, <tex>11000111</tex>, <tex>1110</tex>, <tex>1</tex>, <tex>000</tex>. <br> | В качестве примеров нуль-единичной битонической последовательности можно привести последовательности <tex>00111000</tex>, <tex>11000111</tex>, <tex>1110</tex>, <tex>1</tex>, <tex>000</tex>. <br> | ||
<!-- Эта фраза - собственного производства. Но раз АС считает её слишком "корменовской", то я её уберу --> | <!-- Эта фраза - собственного производства. Но раз АС считает её слишком "корменовской", то я её уберу --> | ||
| Строка 17: | Строка 17: | ||
== Битонический сортировщик == | == Битонический сортировщик == | ||
| − | Построим сеть, которая эффективно сортирует все битонические последовательности {{---}} т.н. | + | Построим сеть, которая эффективно сортирует все битонические последовательности {{---}} т.н. '''битонический сортировщик ''(bitonic sorter)'''''. |
{| | {| | ||
| | | | ||
=== Полуфильтр === | === Полуфильтр === | ||
| − | Битонический сортировщик представляет собой каскад так называемых | + | Битонический сортировщик представляет собой каскад так называемых '''полуфильтров ''(half-cleaner)'''''. |
Каждый полуфильтр {{---}} сеть компараторов единичной глубины, в которой <tex>i</tex>-й входной провод сравнивается со входным проводом с номером <tex>\frac{n}{2} + i</tex>, где <tex>i=1,2,...,\frac{n}{2}</tex> (количество входов <tex>n</tex> {{---}} чётное).<br> | Каждый полуфильтр {{---}} сеть компараторов единичной глубины, в которой <tex>i</tex>-й входной провод сравнивается со входным проводом с номером <tex>\frac{n}{2} + i</tex>, где <tex>i=1,2,...,\frac{n}{2}</tex> (количество входов <tex>n</tex> {{---}} чётное).<br> | ||
| Строка 48: | Строка 48: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
| − | + | '''Объединяющая сеть ''(Merger)''''' {{---}} сеть компараторов, объединяющая две отсортированные входные последовательности в одну отсортированную выходную последовательность.}} | |
Построим объединяющую сеть на основе битонического сортировщика. Для этого рассмотрим наши отсортированные входные последовательности: <br> | Построим объединяющую сеть на основе битонического сортировщика. Для этого рассмотрим наши отсортированные входные последовательности: <br> | ||
Отсортированная последовательность имеет вид <tex>0^i1^j</tex> для целых <tex>i, j\ge0</tex>. Запишем две входные последовательности как <tex>0^i1^j</tex> и <tex>0^k1^l</tex>. Если перевернуть вторую последовательность, получится отсортированная по невозрастанию последовательность <tex>1^l0^k</tex>. Если теперь записать первую и перевернутую вторую последовательности подряд, получится битоническая последовательность <tex>0^i1^{j+l}0^k</tex>, которую можно отсортировать в битоническом сортировщике с глубиной <tex>O(\log{n})</tex>. | Отсортированная последовательность имеет вид <tex>0^i1^j</tex> для целых <tex>i, j\ge0</tex>. Запишем две входные последовательности как <tex>0^i1^j</tex> и <tex>0^k1^l</tex>. Если перевернуть вторую последовательность, получится отсортированная по невозрастанию последовательность <tex>1^l0^k</tex>. Если теперь записать первую и перевернутую вторую последовательности подряд, получится битоническая последовательность <tex>0^i1^{j+l}0^k</tex>, которую можно отсортировать в битоническом сортировщике с глубиной <tex>O(\log{n})</tex>. | ||
Версия 20:13, 18 июня 2012
Сеть Бетчера (Batcher bitonic mergesort) — сортирующая сеть размером и глубиной , где — количество элементов для сортировки. Её авторство принадлежит Кену Бетчеру.
В этой статье будет описана сортирующая сеть для случая когда — степень двойки ().
Содержание
Битоническая последовательность
Сначала введем все необходимые понятия для построения сортирующей сети Бетчера.
| Определение: |
| Битонической последовательностью (bitonic sequence) называется числовая последовательность, которая сначала монотонно возрастает, а затем монотонно убывает, или последовательность, которая приводится к такому виду путем циклического сдвига. |
Здесь мы воспользуемся 0-1 принципом и будем рассматривать только нуль-единичные битонические последовательности:
| Определение: |
| Нуль-единичные битонические последовательности — последовательности вида или для целых , где или обозначает идущих подряд единиц или нулей соответственно. |
В качестве примеров нуль-единичной битонической последовательности можно привести последовательности , , , , .
Далее будет показано, что битоническую последовательность можно легко получить из двух отсортированных, поэтому если мы найдем способ эффективно её сортировать, то сможем столь же эффективно сливать (объединять) две отсортированные последовательности в одну. На этой операции и основывается принцип работы описываемой в этой статье сети сортировки.
Битонический сортировщик
Построим сеть, которая эффективно сортирует все битонические последовательности — т.н. битонический сортировщик (bitonic sorter).
ПолуфильтрБитонический сортировщик представляет собой каскад так называемых полуфильтров (half-cleaner).
Каждый полуфильтр — сеть компараторов единичной глубины, в которой -й входной провод сравнивается со входным проводом с номером , где (количество входов — чётное).
|
Построение битонического сортировщика
Теперь используем полуфильтры для сортировки битонических последовательностей. Как только что было доказано, один полуфильтр разделяет битоническую последовательность на две равные части, одна из которых однородна, а другая сама по себе является битонической последовательностью, причем части расположены в правильном порядке. Тогда мы можем каждую часть снова отправить в полуфильтр вдвое меньшего размера, чем предыдущий. Затем, если нужно, четыре получившихся части снова отправить в полуфильтры и так далее, пока количество проводов в одной части больше .
Так можно построить сеть для числа входов, являющегося степенью двойки. Поскольку каждый вертикальный ряд полуфильтров вдвое сокращает число входов, которые необходимо отсортировать, глубина всей сети равна , где — число входов. Количество компараторов равно , потому что размер одного полуфильтра на входов — компараторов, а в слое битонического сортировщика находится полуфильтров, где — номер слоя, начиная с единицы.
Объединяющая сеть
Битонический сортировщик находит своё применение в конструкции так называемой объединяющей сети.
| Определение: |
| Объединяющая сеть (Merger) — сеть компараторов, объединяющая две отсортированные входные последовательности в одну отсортированную выходную последовательность. |
Построим объединяющую сеть на основе битонического сортировщика. Для этого рассмотрим наши отсортированные входные последовательности:
Отсортированная последовательность имеет вид для целых . Запишем две входные последовательности как и . Если перевернуть вторую последовательность, получится отсортированная по невозрастанию последовательность . Если теперь записать первую и перевернутую вторую последовательности подряд, получится битоническая последовательность , которую можно отсортировать в битоническом сортировщике с глубиной .
Объединяющая сеть является ничем иным как битоническим сортировщиком. Единственное отличие в том, что половина входных проводов расположена в обратном порядке (предполагается, что мы объединяем две сети одинакового размера ). Поэтому первый полуфильтр будет отличаться от остальных — он будет соединять -ый провод не с -ым, а с -ым проводом. Схема объединяющей сети для восьми проводов приведена ниже.
Глубина и число компараторов в объединяющей сети очевидно те же, что и в битоническом сортировщике.
Сортирующая сеть
Построение
Теперь, с помощью описанных выше объединяющих сетей мы построим параллельную версию сортировки слиянием.
Пусть мы хотим отсортировать входов, — целое и . Для этого сначала отсортируем пары проводов, поставив в первом слое компаратор между -ым и -ым проводом для нечетных . Затем с помощью объединяющих сетей параллельно объединим отсортированные пары проводов в отсортированные четверки. Затем объединим отсортированные четверки в отсортированные восьмерки. И так далее, пока на выходе очередной объединяющей сети не будет проводов.
Так мы построили сеть, сортирующую любую последовательность из нулей и единиц. А это означает, согласно 0-1 принципу, что она будет сортировать и любой набор чисел.
Точные формулы размера и глубины сети
Оценим глубину этой сортирующей сети. Она состоит из слоёв объединяющих сетей и каждый слой имеет глубину, зависящую от его номера. В слое с номером () объединяющая сеть имеет глубину , потому как объединяет проводов. Таким образом глубина всей сортирующей сети в точности равна .
Оценим размер сети. В объединяющей сети на входов содержится компараторов. Снова просуммируем формулу по числу объединяющих сетей и получим точную оценку .
Источники
- Wikipedia — Bitonic mergesort
- Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2005. — С. 808—818.


