Чому злиття O (log n)?


27

Mergesort - алгоритм розділення і підкорення і є O (log n), оскільки вхід багаторазово зменшується вдвічі. Але чи не повинно це бути O (n), оскільки, хоча введення вдвічі зменшується у кожному циклі, для кожного пункту введення потрібно повторити, щоб зробити заміну в кожному половині масиву? Це по суті асимптотично O (n) у моїй свідомості. Якщо можливо, надайте приклади та поясніть, як правильно рахувати операції! Я ще нічого не кодував, але я дивився алгоритми в Інтернеті. Я також додав gif того, що використовує вікіпедія, щоб візуально показати, як працює злиття.

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



18
Навіть алгоритм сортування Бога (гіпотетичний алгоритм сортування, який має доступ до оракула, який повідомляє йому, де кожен елемент належить) має час виконання O (n), оскільки йому потрібно хоч раз перемістити кожен елемент, який знаходиться в неправильному положенні.
Філіп

Відповіді:


59

Це O (n * log (n)), а не O (log (n)). Як ви точно визначили, весь вхід повинен бути повторений, і це має відбуватися O (log (n)) разів (вхід може бути вдвічі меншим O (log (n)) разів). n елементів повторення log (n) разів дає O (n log (n)).

Доведено, що жоден сорт порівняння не може працювати швидше, ніж цей. Тільки сорти, які покладаються на особливу властивість вхідного сигналу, наприклад, сортування radix, можуть обіграти цю складність. Постійні фактори злиття зазвичай не такі великі, хоча алгоритми з гіршою складністю часто можуть зайняти менше часу.


3
s / швидше / з меншою складністю /
jk.

33

Складність сортування злиття становить O (nlogn) та NOT O (logn).

Сортування сортування - це алгоритм розділення та підкорення. Подумайте про це в 3 кроки -

  1. Крок поділу обчислює середню точку кожного з підмасивів. Кожен цей крок просто займає O (1) час.
  2. Крок підкорення рекурсивно сортує два підряди n / 2 (для парних n) елементів кожен.
  3. Крок злиття об'єднує n елементів, що займає час O (n).

Тепер для етапів 1 і 3, тобто між O (1) і O (n), O (n) вище. Розглянемо кроки 1 і 3, що займають час O (n). Скажіть, це cn для деякої постійної c.

Скільки разів виконуються ці кроки?

Для цього подивіться на дерево нижче - для кожного рівня зверху вниз рівень 2 викликає метод злиття на 2 підмасивах довжиною n / 2 кожен. Складність тут 2 * (cn / 2) = cn 3 рівень викликає метод злиття на 4 підмасивах довжиною n / 4 кожен. Складність тут 4 * (cn / 4) = cn і так далі ...

Тепер висота цього дерева становить (logn + 1) для заданого n. Таким чином, загальна складність становить (logn + 1) * (cn). Це O (nlogn) для алгоритму сортування злиття.

Об’єднання сортування для n елементів

Іміджеві кредити: Академія Хана


9

Сортування злиття - це рекурсивний алгоритм, і складність у часі може бути виражена наступним відношенням рецидиву.

T (n) = 2T (n / 2) + ɵ (n)

Вищезазначені рецидиви можуть бути вирішені або за допомогою методу дерева повторень або методу Master. Він підпадає у випадку, якщо II головного методу і рішення повторення є is (n log n).

Часова складність сортування об'єднань становить ɵ (nLogn) у всіх 3 випадках (найгірший, середній та найкращий), оскільки сортування злиття завжди ділить масив на дві половини та потрібен лінійний час для об'єднання двох половин.

Він розділяє вхідний масив на дві половини, називає себе двома половинами, а потім об'єднує дві відсортовані половинки. Функція merg () використовується для об'єднання двох половинок. Злиття (arr, l, m, r) є ключовим процесом, який передбачає, що arr [l..m] і arr [m + 1..r] сортуються і об'єднують два відсортовані підмасиви в один. Докладні відомості див. У наступній реалізації C.

MergeSort(arr[], l,  r)
If r > l
     1. Find the middle point to divide the array into two halves:  
             middle m = (l+r)/2
     2. Call mergeSort for first half:   
             Call mergeSort(arr, l, m)
     3. Call mergeSort for second half:
             Call mergeSort(arr, m+1, r)
     4. Merge the two halves sorted in step 2 and 3:
             Call merge(arr, l, m, r)

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

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


1
Не могли б ви детальніше ознайомитись із характером частини її злиття та як вона сприяє виконанню роботи O (n log n)?

Складність функції злиття дорівнює O (n), оскільки вона бере 2 масиви як вхід, порівняйте їх та дайте вихід у нових. При порівнянні кожного елемента з усіма іншими елементами масиву складність цієї функції злиття виявляється O (n).
Nishant sethi

1
Я люблю цю візуалізацію подібного роду!
spaaarky21

0

Алгоритми сортування на основі порівняння мають нижню межу 𝞨(n*log(n)), а це означає, що алгоритм сортування на основі порівняння за O(log(n))складністю за часом неможливо .

До речі, сортування злиття є O(n*log(n)). Подумайте так.

[ a1,a2,         a3,a4,         a5,a6,          a7,a8     .... an-3,an-2,     an-1, an ] 
   \ /            \  /           \ /             \  /            \  /            \  /    
    a1'            a3'            a5'             a7'            an-3'           an-1'    
      \            /                \             /                 \             /
            a1''                          a5''                       an-3''
             \                             /                         /
                          a1'''                                     /
                           \
                                              a1''''

Це виглядає зворотним двійковим деревом.

Нехай розмір введення буде n.

Кожен a_nпредставляє список елементів. Перший рядок a_nмає лише один елемент.

На кожному рівні сума витрат на злиття в середньому становить n(є кутові випадки, вартість яких нижча [1]). А висота дерева така log_2(n).

Отже, часова складність сортування злиття є O(n*log_2(n)).

[1] якщо сортування за списком, який уже відсортований, що називається найкращим випадком. вартість зменшена до n/2 + n/4 + n/8 + .... + 1 = 2^log_2(n) -1 ~ O(n). (припустимо, довжина n- потужність двох)


-2

Сортування - це NP-Повна проблема інформатики (Неполіномальна задача). Це означає, що, якщо математично не доведено, при сортуванні списку елементів ви не можете піти нижче O (n log n).

Перевірте цю статтю у Вікіпедії ( https://en.wikipedia.org/wiki/P_versus_NP_problem )

В основному поки що ніхто не встиг довести, що (P == NP), і якщо ви це зробите, ви першим стаєте мільйонером, а потім починаєте третю світову війну через те, що вам вдасться зламати всі використовувані механізми безпеки pub / private скрізь сьогодні :)


2
Це не те, що означає НП. Навіть BubbleSort є в P. Ви повинні дуже постаратися зробити сорт, який не є в P (наприклад, BogoSort)
Caleth
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.