0-1 принцип — различия между версиями
м |
м (rollbackEdits.php mass rollback) |
||
(не показана 21 промежуточная версия 7 участников) | |||
Строка 1: | Строка 1: | ||
− | Есть два способа проверить сеть из n компараторов на то, что она сортирующая. | + | Есть два способа проверить сеть из <tex>n</tex> компараторов на то, что она сортирующая. |
__TOC__ | __TOC__ | ||
== Первый способ == | == Первый способ == | ||
− | Первый, наивный способ | + | Первый, наивный способ — перебрать все перестановки из <tex> n </tex> элементов, пропустить их через сеть и проверить их на то, что они отсортированы. Этот подход потребует <tex> O(n! \cdot Comp(n)) </tex> действий, где <tex> Comp(n) </tex> — количество компараторов в сети из <tex>n</tex> элементов. Это количество можно оценить как <tex> n \log^2n </tex> ([[Сеть_Бетчера|Сеть Бетчера]]). Таким образом, получаем асимптотику <tex> O(n!n \log^2n) </tex>, и при <tex>n = 10</tex> проверить сеть очень проблематично. |
== Второй способ == | == Второй способ == | ||
− | Второй способ основывается на предположении что если сеть сортирует все последовательности из нулей и единиц, то сеть является сортирующей. Если мы докажем это, то сможем проверять сеть за <tex> O(2^n \cdot Comp(n)) </tex>, что намного быстрее. | + | Второй способ основывается на предположении, что если сеть сортирует все последовательности из нулей и единиц, то сеть является сортирующей. Если мы докажем это, то сможем проверять сеть за <tex> O(2^n \cdot Comp(n)) </tex>, что намного быстрее. |
=== Доказательство 0-1 принципа === | === Доказательство 0-1 принципа === | ||
{{ Определение | {{ Определение | ||
| definition = | | definition = | ||
− | Функция <tex> f </tex> | + | Функция <tex> f: A \rightarrow B </tex> называется '''монотонной''' (англ. ''monotonous''), если <tex> \forall a_1, a_2 \in A : a_1 \leqslant a_2 \Rightarrow f(a_1) \leqslant f(a_2) </tex> |
}} | }} | ||
{{Лемма | {{Лемма | ||
| statement = | | statement = | ||
− | Пусть <tex> f: A \rightarrow B </tex> | + | Пусть <tex> f: A \rightarrow B </tex> — монотонная. Тогда <tex> \forall a_1, a_2 \in A: f(\min(a_1, a_2)) = \min(f(a_1), f(a_2)) </tex>. |
| proof = | | proof = | ||
− | Не теряя общности, предположим что <tex> a_1 \ | + | Не теряя общности, предположим что <tex> a_1 \leqslant a_2 </tex>. Тогда <tex> f(\min(a_1, a_2)) = f(a_1) </tex>. Также, по монотонности, <tex> f(a_1) \leqslant f(a_2) </tex>. Тогда <tex> \min(f(a_1), f(a_2)) = f(a_1) </tex>. То есть, |
<tex> f(\min(a_1, a_2)) = \min(f(a_1), f(a_2)) = f(a_1) </tex>. Такие же рассуждения можно провести для случая <tex> a_2 < a_1 </tex>. | <tex> f(\min(a_1, a_2)) = \min(f(a_1), f(a_2)) = f(a_1) </tex>. Такие же рассуждения можно провести для случая <tex> a_2 < a_1 </tex>. | ||
Строка 31: | Строка 31: | ||
{{Лемма | {{Лемма | ||
| statement = | | statement = | ||
− | Пусть <tex> f: A \rightarrow B </tex> | + | Пусть <tex> f: A \rightarrow B </tex> — монотонная, а <tex> N </tex> — сеть компараторов. |
+ | Тогда <tex> N </tex> и <tex> f </tex> коммутируют, то есть <tex> N(f(a)) = f(N(a)) </tex>. Другими словами, неважно, применить сначала <tex> f </tex> к <tex> a </tex> и пропустить через сеть <tex> N </tex>, или пропустить через сеть <tex> N </tex> последовательность <tex> a </tex>, а потом применить монотонную функцию <tex> f </tex>. | ||
| proof = | | proof = | ||
Рассмотрим произвольный компаратор <tex> [i: j] </tex>, сортирующий элементы <tex> a_i </tex> и <tex> a_j </tex>. Применим его к последовательности <tex> f(a) </tex> и рассмотрим элемент с индексом <tex> i </tex>. | Рассмотрим произвольный компаратор <tex> [i: j] </tex>, сортирующий элементы <tex> a_i </tex> и <tex> a_j </tex>. Применим его к последовательности <tex> f(a) </tex> и рассмотрим элемент с индексом <tex> i </tex>. | ||
− | <tex> [i: j]f(a)_i </tex> | + | Тогда <tex> [i: j]f(a)_i =</tex> |
− | + | *<tex> [i: j](f(a_0), \dots, f(a_{n-1}))_i </tex> (по введенному выше определению) | |
− | + | *<tex> f([i: j](a))_i = f([i: j](a)_i) </tex> (по определению компаратора и по введенному выше определению) | |
+ | *<tex> \min(f(a_i), f(a_j)) = f(\min(a_i, a_j)) </tex> (по определению компаратора и по уже доказанной лемме). | ||
+ | Таким образом, результат не зависит от того, что мы сделаем с отдельным компаратором сначала: применим монотонную функцию или пропустим его через сеть. Те же рассуждения можно провести для всех других индексов, то есть <tex> [i: j]f(a) = f([i: j](a)) </tex> для всех компараторов в сети, то есть лемма доказана. | ||
}} | }} | ||
Строка 45: | Строка 48: | ||
| statement = Если сеть компараторов сортирует все последовательности из нулей и единиц, то она сортирующая | | statement = Если сеть компараторов сортирует все последовательности из нулей и единиц, то она сортирующая | ||
| proof = | | proof = | ||
− | Рассмотрим сеть <tex> N </tex> , сортирующую в возрастающем порядке: <tex> a_0 \ | + | Рассмотрим сеть <tex> N </tex>, сортирующую в возрастающем порядке: <tex> a_0 \leqslant a_1 \leqslant \dots \leqslant a_{n-1} </tex>. |
− | Предположим, что есть последовательность <tex> a </tex>, которую сеть <tex> N </tex> не сортирует. Тогда после пропуска <tex> a </tex> через сеть <tex> N </tex>, получим последовательность b, в которой найдется индекс <tex> i </tex> такой, что <tex> b_i > b_{i + 1} </tex>. | + | Предположим, что есть последовательность <tex> a </tex>, которую сеть <tex> N </tex> не сортирует. Тогда после пропуска <tex> a </tex> через сеть <tex> N </tex>, получим последовательность <tex> b </tex>, в которой найдется индекс <tex> i </tex> такой, что <tex> b_i > b_{i + 1} </tex>. |
Рассмотрим функцию <tex> f(x) = | Рассмотрим функцию <tex> f(x) = | ||
Строка 54: | Строка 57: | ||
1, x \ge b_i | 1, x \ge b_i | ||
\end{cases} | \end{cases} | ||
− | </tex> . Очевидно, она монотонная. Заметим, что <tex> f(b_i) = 1 </tex>, а <tex> f(b_{i + 1}) = 0 </tex>, то есть <tex> f(b) </tex>, или <tex> f(N(a)) </tex> | + | </tex> . Очевидно, она монотонная. Заметим, что <tex> f(b_i) = 1 </tex>, а <tex> f(b_{i + 1}) = 0 </tex>, то есть <tex> f(b) </tex>, или <tex> f(N(a)) </tex> — не отсортирована. Так как <tex> f </tex> и <tex> N </tex> коммутируют, <tex> N(f(a)) </tex> — также не отсортирована. Но по предположению теоремы, все последовательности из нулей и единиц сеть сортировать умеет, то есть такой последовательности <tex> a </tex> не найдется, то есть сеть компараторов является сортирующей. |
}} | }} | ||
− | == Источники == | + | == См. также == |
− | * [http://www.inf.fh-flensburg.de/lang/algorithmen/sortieren/networks/indexen. | + | *[[Сеть_Бетчера|Сеть Бетчера]] |
− | * [http://en.wikipedia.org/wiki/Sorting_network Wikipedia - Sorting networks] | + | *[[Сортирующие_сети|Сортирующие сети]] |
− | * Дональд Кнут - Искусство программирования | + | |
+ | == Источники информации == | ||
+ | *[http://www.inf.fh-flensburg.de/lang/algorithmen/sortieren/networks/indexen.htm Bachelor-Studiengang Angewandte Informatik {{---}} Sorting networks] | ||
+ | *[http://en.wikipedia.org/wiki/Sorting_network Wikipedia {{---}} Sorting networks] | ||
+ | *Дональд Кнут {{---}} Искусство программирования {{---}} Том 3 {{---}} Глава 5.3.4 {{---}} стр. 249 | ||
− | [[Категория: Сортирующие сети]] | + | [[Категория:Дискретная математика и алгоритмы]] |
+ | [[Категория:Сортирующие сети]] |
Текущая версия на 19:35, 4 сентября 2022
Есть два способа проверить сеть из
компараторов на то, что она сортирующая.Содержание
Первый способ
Первый, наивный способ — перебрать все перестановки из Сеть Бетчера). Таким образом, получаем асимптотику , и при проверить сеть очень проблематично.
элементов, пропустить их через сеть и проверить их на то, что они отсортированы. Этот подход потребует действий, где — количество компараторов в сети из элементов. Это количество можно оценить как (Второй способ
Второй способ основывается на предположении, что если сеть сортирует все последовательности из нулей и единиц, то сеть является сортирующей. Если мы докажем это, то сможем проверять сеть за
, что намного быстрее.Доказательство 0-1 принципа
Определение: |
Функция | называется монотонной (англ. monotonous), если
Лемма: |
Пусть — монотонная. Тогда . |
Доказательство: |
Не теряя общности, предположим что . Тогда . Также, по монотонности, . Тогда . То есть, . Такие же рассуждения можно провести для случая . |
Определение: |
Рассмотрим отображение | и последовательность . Определим как последовательность , то есть
Лемма: |
Пусть — монотонная, а — сеть компараторов.
Тогда и коммутируют, то есть . Другими словами, неважно, применить сначала к и пропустить через сеть , или пропустить через сеть последовательность , а потом применить монотонную функцию . |
Доказательство: |
Рассмотрим произвольный компаратор , сортирующий элементы и . Применим его к последовательности и рассмотрим элемент с индексом .Тогда
|
Теорема (0-1 принцип): |
Если сеть компараторов сортирует все последовательности из нулей и единиц, то она сортирующая |
Доказательство: |
Рассмотрим сеть , сортирующую в возрастающем порядке: .Предположим, что есть последовательность Рассмотрим функцию , которую сеть не сортирует. Тогда после пропуска через сеть , получим последовательность , в которой найдется индекс такой, что . . Очевидно, она монотонная. Заметим, что , а , то есть , или — не отсортирована. Так как и коммутируют, — также не отсортирована. Но по предположению теоремы, все последовательности из нулей и единиц сеть сортировать умеет, то есть такой последовательности не найдется, то есть сеть компараторов является сортирующей. |
См. также
Источники информации
- Bachelor-Studiengang Angewandte Informatik — Sorting networks
- Wikipedia — Sorting networks
- Дональд Кнут — Искусство программирования — Том 3 — Глава 5.3.4 — стр. 249