Що таке O (log * N)?


80

Що таке O (log * N) і чим він відрізняється від O (log N)?


Подібне питання: stackoverflow.com/questions/2307283/… На O(log* N)жаль, відповіді немає .
BalusC 05.03.10

1
Це питання про * після журналу чи взагалі про позначення O ()?
Барт ван Хейкелом,

1
Це в деяких вдосконалених структурах даних, хоча я занадто довго поза школою, щоб згадувати, звідки це походить!
Ларрі

1
Я думаю , не так досконала, просто згадав - Союз Знайти компресійного шлях початковий нижня межа була встановлена на рівні O (п журнал * п) до тих пір, поки не знижували до O (A N), де А зворотна функція Аккермана ..
Larry

1
Хе. На практиці я думаю, що мене б задовольнила оцінка O (n) для цього. :-)
RBarryYoung

Відповіді:


84

O( log* N )є " ітераційним логарифмом ":

В інформатиці повторний логарифм n, записаний log * n (зазвичай читається як "зірка журналу"), - це кількість разів, коли функція логарифму повинна бути ітеративно застосована, перш ніж результат буде меншим або рівним 1.


9
Це справді цікава річ, про яку я не чув. Q + A +1 кожен. Я вважаю, що O (log * N) призначений для всіх намірів та цілей O (1). Класно.
Грег

1
@greg, відсутність журналу (n) означає, що в міру збільшення кількості елементів час зростає повільніше. напр. У 10 разів більше елементів лише для того, щоб функція зайняла вдвічі більше часу
Мартін Беккет

2
Думаю, я вперше зіткнувся з ним при аналізі алгоритму Union-Find, коли він був O( N log* N )до того, як його вдосконалили O( A N ), де A - обернена функція Аккермана. Я досі не розумію останнього доказу, але O( N log* N )алгоритм порівняно добре читається.
Ларрі

13
@Martin, але це журнал * (n), який шалено повільно піднімається вгору, такий що log * (2 ^ 65536 -1) = 5. Ви також можете назвати цю константу.
Грег

4
Вибачте, я не оцінив різницю між журналами та зірками, дякую - дізнавшись щось нове!
Мартін Беккет

25

log* NБіт ітерованих алгоритм , який росте дуже повільно, набагато повільніше , ніж просто log N. Ви просто продовжуєте ітеративно «реєструвати» відповідь, поки вона не опуститься нижче одиниці (Напр .:) log(log(log(...log(N))), і скільки разів вам доводилося log()відповідати.

У будь-якому випадку, це п’ятирічне питання щодо Stackoverflow, але коду немає? (!) Давайте це виправим - ось реалізації як для рекурсивної, так і для ітераційної функції (вони обидва дають однаковий результат):

public double iteratedLogRecursive(double n, double b)
{
    if (n > 1.0) {
        return 1.0 + iteratedLogRecursive( Math.Log(n, b),b );
    }
    else return 0;
}

public int iteratedLogIterative(double n, double b)
{
    int count=0;
    while (n >= 1) {
        n = Math.Log(n,b);
        count++;
    }
    return count;
}

2
Як це відповідає на питання?
Марун

3
@MarounMaroun: Я відредагував початок відповіді, щоб надати більше контексту. Код - це опис / визначення, про яке він просив.
Dan W

9

log * (n) - "Зірка журналу n" , відома як "Ітераційний логарифм"

У простому слові ви можете припустити log * (n) = log (log (log (..... (log * (n)))))

log * (n) дуже потужний.

Приклад:

1) Журнал * (n) = 5 де n = Кількість атома у Всесвіті

2) Розфарбовування дерев із використанням 3 кольорів можна виконати у журналі * (n), тоді як забарвлення кольорів Tree 2 достатньо, але складність тоді буде O (n).

3) Знаходження триангуляції Делоне набору точок, знаючи мінімальне евклідове дерево, що охоплює: рандомізований час O (n log * n).

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