Сеть Бетчера — различия между версиями
Murtaught (обсуждение | вклад) (Сортирующая сеть) |
Murtaught (обсуждение | вклад) (Перенес картинки вниз) |
||
Строка 23: | Строка 23: | ||
Основной элемент битонического сортировщика называется <b>полуфильтром <i>(half-cleaner)</i></b>. | Основной элемент битонического сортировщика называется <b>полуфильтром <i>(half-cleaner)</i></b>. | ||
Каждый полуфильтр {{---}} сравнивающая сеть единичной глубины, в которой <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> | ||
− | [[Файл:Half-Cleaner1.png|250px| | + | ||[[Файл:Half-Cleaner1.png|250px|right|thumb|Рис.1 Полуфильтр для 8 проводов.]] |
+ | |} | ||
+ | {| | ||
+ | | | ||
{{Лемма|statement= | {{Лемма|statement= | ||
Если на вход в полуфильтр подать битоническую последовательность из нулей и единиц длиной <tex>n</tex>, то на выходе мы получим две битонические последовательности длиной <tex>\frac{n}{2}</tex> такие, что каждый элемент из верхней последовательности не превосходит любой элемент из нижней, и что одна из них будет <b>''однородной''</b> (clean) {{---}} целиком состоящей либо из нулей, либо из единиц.<br> | Если на вход в полуфильтр подать битоническую последовательность из нулей и единиц длиной <tex>n</tex>, то на выходе мы получим две битонические последовательности длиной <tex>\frac{n}{2}</tex> такие, что каждый элемент из верхней последовательности не превосходит любой элемент из нижней, и что одна из них будет <b>''однородной''</b> (clean) {{---}} целиком состоящей либо из нулей, либо из единиц.<br> | ||
Строка 33: | Строка 36: | ||
||[[Файл:Half-Cleaner-proof.png|200px|right|thumb|Рис.2 Все случаи попадания битонической последовательности на полуфильтр.]] | ||[[Файл:Half-Cleaner-proof.png|200px|right|thumb|Рис.2 Все случаи попадания битонической последовательности на полуфильтр.]] | ||
|} | |} | ||
− | + | ||
− | + | ==== Собственно битонический сортировщик ==== | |
− | |||
− | ==== | ||
Теперь используем полуфильтры для сортировки битонических последовательностей. Как только что было доказано, один полуфильтр разделяет битоническую последовательность на две равные части, одна из которых однородна, а другая сама по себе является битонической последовательностью, причем части расположены в правильном порядке. Тогда мы можем каждую часть снова отправить в полуфильтр вдвое меньшего размера, чем предыдущий. Затем, если нужно, четыре получившихся части снова отправить в полуфильтры и так далее, пока количество проводов в одной части больше <tex>1</tex>. | Теперь используем полуфильтры для сортировки битонических последовательностей. Как только что было доказано, один полуфильтр разделяет битоническую последовательность на две равные части, одна из которых однородна, а другая сама по себе является битонической последовательностью, причем части расположены в правильном порядке. Тогда мы можем каждую часть снова отправить в полуфильтр вдвое меньшего размера, чем предыдущий. Затем, если нужно, четыре получившихся части снова отправить в полуфильтры и так далее, пока количество проводов в одной части больше <tex>1</tex>. | ||
+ | Схема битонического сортировщика для восьми входов приведен на рис. 3. | ||
Так можно построить сеть для числа входов, являющегося степенью <tex>2</tex>. Поскольку каждый вертикальный ряд полуфильтров вдвое сокращает число входов, которые необходимо отсортировать, глубина всей сети равна <tex>\log_{2}n</tex>, где <tex>n</tex> {{---}} число входов. | Так можно построить сеть для числа входов, являющегося степенью <tex>2</tex>. Поскольку каждый вертикальный ряд полуфильтров вдвое сокращает число входов, которые необходимо отсортировать, глубина всей сети равна <tex>\log_{2}n</tex>, где <tex>n</tex> {{---}} число входов. | ||
− | |||
− | |||
=== Объединяющая сеть === | === Объединяющая сеть === | ||
− | + | Битонический сортировщик находит своё применение в конструкции так называемой <b>объединяющей сети</b>. | |
− | |||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
Строка 52: | Строка 51: | ||
Отсортированная последовательность имеет вид <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>. | ||
− | Объединяющая сеть является ничем иным как битоническим сортировщиком. Единственное отличие в том, что половина входных проводов расположена в обратном порядке (предполагается, что мы объединяем две сети одинакового размера <tex>\frac{n}{2}</tex>). Поэтому первый полуфильтр будет отличаться от остальных {{---}} он будет соединять <tex>i</tex>-ый провод не с <tex>\frac{n}{2} + i</tex>-ым, а с <tex>n-i+1</tex>-ым проводом. | + | Объединяющая сеть является ничем иным как битоническим сортировщиком. Единственное отличие в том, что половина входных проводов расположена в обратном порядке (предполагается, что мы объединяем две сети одинакового размера <tex>\frac{n}{2}</tex>). Поэтому первый полуфильтр будет отличаться от остальных {{---}} он будет соединять <tex>i</tex>-ый провод не с <tex>\frac{n}{2} + i</tex>-ым, а с <tex>n-i+1</tex>-ым проводом. Схема объединяющей сети для восьми проводов приведена на рисунке 4. |
− | |||
− | |||
− | |||
− | |||
=== Сортирующая сеть === | === Сортирующая сеть === | ||
Теперь, с помощью описанных выше объединяющих сетей мы построим параллельную версию [[сортировка слиянием|сортировки слиянием]]. <br> | Теперь, с помощью описанных выше объединяющих сетей мы построим параллельную версию [[сортировка слиянием|сортировки слиянием]]. <br> | ||
Пусть мы хотим отсортировать <tex>n=2^k</tex> входов, <tex>k</tex> {{---}} целое и <tex>k \ge0</tex>. Для этого сначала отсортируем пары проводов, поставив в первом слое компаратор между <tex>i</tex>-ым и <tex>i+1</tex>-ым проводом для нечетных <tex>i < n</tex>. Затем с помощью объединяющих сетей параллельно объединим отсортированные пары проводов в отсортированные четверки. Затем объединим отсортированные четверки в отсортированные восьмерки. И так далее, пока на выходе очередной объединяющей сети не будет <tex>n</tex> проводов. <br> | Пусть мы хотим отсортировать <tex>n=2^k</tex> входов, <tex>k</tex> {{---}} целое и <tex>k \ge0</tex>. Для этого сначала отсортируем пары проводов, поставив в первом слое компаратор между <tex>i</tex>-ым и <tex>i+1</tex>-ым проводом для нечетных <tex>i < n</tex>. Затем с помощью объединяющих сетей параллельно объединим отсортированные пары проводов в отсортированные четверки. Затем объединим отсортированные четверки в отсортированные восьмерки. И так далее, пока на выходе очередной объединяющей сети не будет <tex>n</tex> проводов. <br> | ||
− | + | Схема такой сети приведена на рис. 5. | |
− | ||[[Файл:Sorter_8.png|365px|right|thumb|Рис.5 Сортирующая сеть для | + | |
+ | {| | ||
+ | |[[Файл:Bitonic_sorter_8.png|305px|left|thumb|Рис.3 Битонический сортировщик на восемь входов с выделенными полуфильтрами.]] | ||
+ | ||[[Файл:Merger_8.png|294px|center|thumb|Рис.4 Сеть, объединяющая две отсортированные последовательности из четырёх чисел в одну отсортированную последовательность из восьми чисел.]] | ||
+ | ||[[Файл:Sorter_8.png|365px|right|thumb|Рис.5 Сортирующая сеть для восьми проводов.]] <br> | ||
|} | |} | ||
+ | |||
==Источники== | ==Источники== | ||
*[http://en.wikipedia.org/wiki/Batcher_odd-even_mergesort Wikipedia {{---}} Batcher odd-even mergesort] | *[http://en.wikipedia.org/wiki/Batcher_odd-even_mergesort Wikipedia {{---}} Batcher odd-even mergesort] | ||
*Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2005. — С. 808—818. | *Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2005. — С. 808—818. | ||
<!-- TODO: проверить 2007 издание Кормена и написать его --> | <!-- TODO: проверить 2007 издание Кормена и написать его --> |
Версия 23:58, 5 июня 2012
Содержание
Определение
Сеть Бетчера (Batcher odd-even mergesort) — сортирующая сеть размером
и глубиной , где — количество элементов для сортировки.Конструирование сети
Для начала введем понятие битонической последовательности:
Определение: |
Битонической последовательностью называется последовательность, которая сначала монотонно возрастает, а затем монотонно убывает, или последовательность, которая приводится к такому виду путем циклического сдвига. |
Сейчас мы будем рассматривать только нуль-единичные битонические последовательности:
Определение: |
Нуль-единичные битонические последовательности — последовательности вида | или для целых , где или обозначает идущих подряд единиц или нулей соответственно.
В качестве примеров нуль-единичной битонической последовательности можно привести последовательности
С первого взгляда битонические последовательности могут показаться бесполезными в деле построения сортирующих сетей, но на самом деле они обладают одним полезным свойством: если соединить вместе две отсортированные последовательности, причем одна из них должна быть отсортировала по возрастанию, а другая по убыванию — то получится битоническая последовательность. Далее этому свойству будет найдено применение.
Битонический сортировщик
Построим сеть, которая эффективно сортирует все битонические последовательности — т.н. битонический сортировщик.
ПолуфильтрОсновной элемент битонического сортировщика называется полуфильтром (half-cleaner).
Каждый полуфильтр — сравнивающая сеть единичной глубины, в которой |
|
Собственно битонический сортировщик
Теперь используем полуфильтры для сортировки битонических последовательностей. Как только что было доказано, один полуфильтр разделяет битоническую последовательность на две равные части, одна из которых однородна, а другая сама по себе является битонической последовательностью, причем части расположены в правильном порядке. Тогда мы можем каждую часть снова отправить в полуфильтр вдвое меньшего размера, чем предыдущий. Затем, если нужно, четыре получившихся части снова отправить в полуфильтры и так далее, пока количество проводов в одной части больше
. Схема битонического сортировщика для восьми входов приведен на рис. 3.Так можно построить сеть для числа входов, являющегося степенью
. Поскольку каждый вертикальный ряд полуфильтров вдвое сокращает число входов, которые необходимо отсортировать, глубина всей сети равна , где — число входов.Объединяющая сеть
Битонический сортировщик находит своё применение в конструкции так называемой объединяющей сети.
Определение: |
Объединяющая сеть (Merger) — сеть компараторов, объединяющая две отсортированные входные последовательности в одну отсортированную выходную последовательность. |
Построим объединяющую сеть на основе битонического сортировщика. Для этого рассмотрим наши отсортированные входные последовательности:
Отсортированная последовательность имеет вид для целых . Запишем две входные последовательности как и . Если перевернуть вторую последовательность, получится отсортированная по невозрастанию последовательность . Если теперь записать первую и перевернутую вторую последовательности подряд, получится битоническая последовательность , которую можно отсортировать в битоническом сортировщике с глубиной .
Объединяющая сеть является ничем иным как битоническим сортировщиком. Единственное отличие в том, что половина входных проводов расположена в обратном порядке (предполагается, что мы объединяем две сети одинакового размера
). Поэтому первый полуфильтр будет отличаться от остальных — он будет соединять -ый провод не с -ым, а с -ым проводом. Схема объединяющей сети для восьми проводов приведена на рисунке 4.Сортирующая сеть
Теперь, с помощью описанных выше объединяющих сетей мы построим параллельную версию сортировки слиянием.
Пусть мы хотим отсортировать входов, — целое и . Для этого сначала отсортируем пары проводов, поставив в первом слое компаратор между -ым и -ым проводом для нечетных . Затем с помощью объединяющих сетей параллельно объединим отсортированные пары проводов в отсортированные четверки. Затем объединим отсортированные четверки в отсортированные восьмерки. И так далее, пока на выходе очередной объединяющей сети не будет проводов.
Схема такой сети приведена на рис. 5.
|
Источники
- Wikipedia — Batcher odd-even mergesort
- Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2005. — С. 808—818.