Алгоритми: Як я сумую O (n) та O (nlog (n)) разом?


22

У мене є наступний алгоритм, який знаходить дублікати та видаляє їх:

public static int numDuplicatesB(int[] arr) {
    Sort.mergesort(arr);
    int numDups = 0;
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] == arr[i - 1]) {
            numDups++;
} }
    return numDups;
}

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


1
Бічна примітка: ви можете використовувати хеш-таблицю, щоб зробити це в O (n), залежно від потреби в пам'яті.
corsiKa

Відповіді:


67
O(n) + O(n log(n)) = O(n log(n))

Для складності Big O все, що вам цікаво, є домінуючим терміном. n log(n)домінує, nтож це єдиний термін, який вас хвилює.


4
Ще один спосіб подумати над цим - уявити, що ваша O (n) обробка справді була O (n log n), як ніби ви зробили два незалежні сортування. Тоді ви мали б 2 * O (n log n). Але константи простоюються, тому ви повертаєтесь до O (n log n).
Джонатан Юніс

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

17
@Emrakul насправді я вважаю, що міркування теоретично обгрунтовані та практичні. O (n) - власне підмножина O (n log (n)). Отже, якщо f (n) належить O (n), він також належить O (n log (n)).
emory

17
Слід зазначити, що коли ми говоримо, f(n) is O(g(n))що ми говоримо насправді, це функція f is a member of the set of functions that grows at the rate of at most g(n) over the long term. Це означає, що всі члени O(n)також є членами O(n*log(n)). Такі +вирази, як O(f(n)) + O(g(n))насправді, відносяться до встановлення з'єднання (який із вас насправді педантичний, ви дійсно повинні використовувати ∪).
Лі Лі Райан

3
@LieRyan Спочатку він не встановлений союз, але множинна сума: A + B = { a + b | a in A, b in B }. Буває, що для множини форми O(g(n))це те саме, що і множинне об'єднання, оскільки одна з множин завжди є підмножиною іншої, і вони обидві інваріантні сумам (тобто A + A = A). (На жаль, Нейт писав по суті те саме).
Paŭlo Ebermann

56

Давайте обґрунтуємо свій шлях та згадаємо визначення O. Той, котрим я буду користуватися, є обмеженням у нескінченності.

Ви маєте рацію в тому , що ви виконати дві операції з відповідними асимптотические межі O(n)і , O(nlog(n))але їх об'єднання в єдину кордон не так просто , як додати дві функції. Ви знаєте, що ваша функція займає принаймні O(n)час, а також хоча б O(nlog(n))час. Так на самому ділі клас складності для вашої функції є об'єднанням O(n)і O(nlog(n))але O(nlog(n))є надбудовою O(n)так на самому ділі це просто O(nlog(n)).


12
+1 це має бути відповіддю. Він описує відповідь точніше, використовуючи терміни compsci.

5

Якщо ви збираєтеся викладати це на довгі руки, це виглядало б приблизно так:

Припустимо, загальний час становить: an + bn log (n), де a і b - константи (ігноруючи умови нижчого порядку).

Оскільки n переходить до нескінченності (an + bn log (n)) / n log (n) -> a / log (n) + b -> b

Отже загальний час дорівнює O (bn log (n)) = O (n log (n)).


2

Почніть з визначення O ():

O (n log n) означає "менше, ніж C n log n, якщо n є великим".

O (n) означає "менше D n, якщо n великий".

Якщо додати обидва, результат менший ніж C n log n + D n <C n log n + D n log n <(C + D) n log n = O (n log n).

Загалом, якщо f (n)> C g (n) для великих n і деяких C> 0, то O (f (n)) + O (g (n)) = O (f (n)). І зробивши кілька випадків, використовуючи визначення O (), ви дізнаєтесь, що можна, а що не можна робити.


1

Велике позначення O визначається як безліч:

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

Отже, введіть тут опис зображеннямістяться всі функції, які - починаючи з якоїсь довільної великої точки введіть тут опис зображення- завжди менші за g.

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

Більш офіційно:

f, h \ in \ mathcal {O} (g) \ Rightarrow (f + h) \ in \ mathcal {O} (g)

Ви можете легко довести це.

TL; DR

Це досі n журнал (n)

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