Сортування за допомогою чорного поля


20

Припустимо, що ми хочемо сортувати список з n реальних чисел. Припустимо, що нам дають чорний ящик, який може сортувати Sn миттєвих цифр миттєво. Скільки переваг ми можемо отримати, використовуючи цю чорну скриньку?n

Наприклад, може ми сортуємо номери тільки з дзвінки в чорну скриньку? Найкращий алгоритм, який я знайшов, використовуєnдзвінків до чорного поля. Але я не зміг її покращити далі. Ось мій алгоритм, схожий на сортування злиття:O(n)n

Перший розділ списку на S спискиз1,˙s2,. . . ,sn з приблизноs1,s2,...,sn розмір. Потімдопомогоюn дзвінків до чорного поля для сортування цих списків. Нарешті, об’єднайте відсортовані списки за допомогою чорного поля таким чином:n

Помістіть найменші елементи списків у новий список , а потім зателефонуйте у чорну скриньку для сортування. Число в L [ 1 ] (перший і найменший елемент L ) буде найменшим номером в S . Ми можемо поставити його на перше місце у списку вихідних даних. Якщо припустити , що елемент був обраний з х J , ми замінимо L [ 1 ] з другим найменшим елементом списку критеріїв сортування сек J , і знову запустити чорний ящик на ньому , щоб обчислити другий найменший елемент з S .LL[1]LS
sjL[1]sjS
Ми продовжуємо, поки всі елементи не будуть відсортовані. Загальна кількість дзвінків з чорної скриньки для цієї частини буде . Тому загальна кількість викликів становитимеn.nnn

З іншого боку, схоже, що ми повинні мати можливість отримати нижню межу, використовуючи нижню межу порівняння чисел, необхідних для сортування, таким чином: Ми можемо реалізувати чорну скриньку за допомогою порівнянь. Якщо ми можемо вирішити задачу за допомогоюo(nlgn=12nlgnвиклики до чорного поля та злиття у лінійному часі, ми можемо сортуватиnдійсних чисел із порівняннямo(nlgn),що неможливо.o(n)no(nlgn)

Я думаю, ми могли б довести, що є нижньою межею для кількості викликів до чорного поля, оскільки багато порівнянь, які використовують у чорному полі, поділяться спільно, і тому вони перераховуються в нашому аргументі.Ω(n)

ОНОВЛЕННЯ: Як підказують інші публікації, також досяжно.nlgn


2
Здається, у вашому коментарі є помилка друку. Можливо , ви мали в виду , щоб сказати: «алгоритм не використовує менше викликів до машини можуть сортуватиNдійсних чисел із порівнянням меншеNlgN"? Ps: ви також повинні бути обережними щодо того, щонижня межаNlgNсправедлива лише для алгоритмів сортування на основі порівняння.NNNlgNNlgN
Kaveh

8
Я думаю, ми навіть можемо отримати використання сортувальної мережі AKS. Їх мережа може розглядатися як примірник вашої моделі, де чорна скринька може сортувати блоки розміром 2. Їх алгоритми використовуютькругліO(logn), кожен раунд викликає 2-сортувальнийO(n)разів. Один "круглий"O(n)2-сортувальників можна легко імітувати за допомогоюO(O(nlogn)O(logn)O(n)O(n)O(n) -кірки n
Vinayak Pathak

6
@VinayakPathak: Розбийте вхідні дані на шматки розміром2N, а потім сортуйте шматки за допомогою мережі AKS, замінивши кожен компаратор наN/2 -зустріч. N
Jeffε

1
@ Jɛ ff E: Так, чудово, що, безумовно, виглядає простіше, ніж моя конструкція.
Vinayak Pathak

1
@ Jɛ ff E, ваші коментарі можуть бути відповіддю. :)
Kaveh

Відповіді:


15

Можна сортувати з дзвінки до чорного поля та відсутність порівнянь.O(nlogn)

Спочатку розглянемо таку задачу збалансованого розподілу: задані елементів A [ 1 .. m ] (де mA[1..m]), розділіть їх на дві групи, найменша за розміром принаймні приблизноm/4, щоб усі елементи першої групи були меншими, ніж усі елементи другої групи. Це можна зробити за допомогоюO(м/nmnm/4дзвінки в чорний ящик. (Я опишу це пізніше.) Потім використовуйте quicksort з цим алгоритмом розподілу:O(m/n)

def qsort(A[1..m]):
   if m < sqrt(n): sort A with one call to the black box
   else:
     Partition A[1..m] into two groups as described above.
     Recursively qsort the first group.
     Recursively qsort the second group.

Якщо припустимо, що кожен етап розділу займає виклики до чорної скриньки, наведений вище алгоритм, заданий вхідA[1 ..n], зробитьO(O(m/n)A[1..n]викликає чорний ящик, оскільки дерево рекурсії має глибинуO(logn)і кожен рівень дерева має загальну кількістьO(n/O(nlogn)O(logn)дзвінки в чорний ящик.O(n/n)=O(n)

Виконайте наступний крок поділу:

def partition(A[1..m]):  (where sqrt(n) <= m <= n)
   Divide A into m/sqrt(n) groups of size sqrt(n) each.
   Sort each group with one call to the black box per group.
   Sort the medians of the groups with one call to the black box.
   (Note the number of groups is less than sqrt(n), because m <= n.)
   Let X be the median of the medians.
   Partition all m elements around X, using the black box as follows:
      For each group G, let Y be its median:
        Call the black box once on (G - {Y}) union {X}.
        (This gives enough information to order all elts w.r.t. X.)

На останньому кроці алгоритму partition (): "Розбийте всі m елементів навколо X", чи не використовуватиме це m додаткові порівняння?
Vinayak Pathak

2
Дивіться рядок, що слідує алгоритму, і він пояснює, як зробити цей крок. Я відредагую це, щоб зробити це зрозумілішим.
Ніл Янг

24

Я думаю, що ваше питання було вирішене в роботі Бейгеля та Гілла " Сортування n об'єктів за допомогою k-сортувальника " з 1990 року, а реферат статті говорить про все:

nlognklogk4nlognklogk


Дякую. Я не зміг знайти папір. Чи можете ви надати посилання на папір або його доказ?
AmeerJ


Також на citeseerx .
Kaveh

8
k=nΘ(n)

12

O(nlogn)n

kn2(n/k)2k2n/k

BlockBubbleSort(X[0..n-1], k):
   m = floor(n/k)
   for i = 1 to m
      for j = 0 to m-1
          BlackBoxSort(X[j*k .. (j+1)*k-1])
      for j = 0 to m-1
          BlackBoxSort(X[j*k + k/2 .. (j+1)*k + k/2 - 1])

n=18k=4k

введіть тут опис зображення

k/2k

O((n/k)2)O((n/k)log2(n/k))=O(nlog2n)O((n/k)log(n/k))=O(nlogn)


Ω(n lg(n))

2
O(n)

+1 за цю приємну картину! Я можу помилятися, але мені здається, що це не зовсім правильно (виправте мене, якщо я помиляюся). Якщо припустити, що вихід знаходиться в порядку зростання, якщо найменший елемент знаходиться в останньому положенні, немає "шляху" для його "подорожі" до першої позиції. Зміна "для i = 1 на m" на "для i = 1 на m + 1", здається, це виправляє, хоча це може ввести непотрібні накладні витрати.
Джордж

@George На жаль, ти маєш рацію; Мені потрібен ще один шар!
Jeffε
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.