Часова складність алгоритму: чи важливо констатувати основу логарифму?


19

Оскільки між базами логарифмів є лише константа, чи не просто добре писати , на відміну від , або що б там не було база може бути?f(n)=Ω(logn)Ω(log2n)


Відповіді:


63

Це залежить, де логарифм. Якщо це просто фактор, то це не має значення, оскільки велика-О або θ дозволяє множити на будь-яку константу.

Якщо взяти O(2logn) то важлива база. У базі 2 у вас було б просто O(n) , у базі 10 - приблизно O(n0.3010) .


5
Я здогадуюсь, що це тільки вийде щось на зразок . Я не бачу жодної причини для вираження числа як2clogbn,а неn-to-the-what-it (крім, можливо, проміжного етапу обчислення). 2logn2clogbnn
Девід Річербі

7
+1 за "постійні фактори мають значення в показниках"
трогнандри

50

Оскільки асимптотичне позначення не обіцяє постійних факторів, а будь-які два логарифми відрізняються постійним коефіцієнтом, основа не має жодної різниці: logan=Θ(logbn) для всіх a,b>1 . Тому немає необхідності вказувати основу логарифму при використанні асимптотичних позначень.


13
Я вважаю за краще бачити замість ==
Наюкі

16
Боюся, що стандартні позначення використовують . =
Юваль Фільм

4
@YuvalFilmus Стандартне позначення вводить в оману, повністю відрізняється від стандарту скрізь, і алгоритмічна складність здається абсолютно чужою від речей, досить подібних до неї. "Це стандартне позначення" ніколи не повинно бути приводом для вибору поганого рішення над кращим, таким же ясним. (Значення символу, як правило, зрозуміло з контексту.)
wizzwizz4

7
@ wizzwizz4 Звичайна практика - відмінна причина. Це сприяє ефективному спілкуванню. Ось чому ми всі мирилися з вигадками англійського правопису.
Ювал Фільм

3
Іноді просто має занадто багато матеріалів, щоб бути зрозумілішим, ніж log a n = Θ ( log b n ) . nloganΘ(nlogbn)logan=Θ(logbn)
JiK

15

Як logxy=1logyx іlogxy=logzylogzx , тому loganlogbn=lognblogna=logab. Оскількиlogabє позитивною константою (для всіхa,b>1), такlogan=Θ(logbn).


8

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

Є деякі випадки, коли це зробити не безпечно. Наприклад, @ gnasher729 вказував, що якщо ви маєте логарифм в експоненті, то логарифмічна основа дійсно значна.

bbΘ(n+b)logbUUO((n+b)logbU)bO(nlogU)бне константа? Розумна техніка - підбиратиб=н, в такому випадку час виконання спрощується до О(н+журналнU). З тих піржурналнU = журналUжурналн, загальний вираз спрощується до О(нжурналUжурналн). Зауважте, що в цьому випадку основа логарифму дійсно значна, оскільки вона не є постійною щодо розміру вводу. Є й інші алгоритми, які мають схожі періоди виконання (старий аналіз лісів, що розмежовуються, закінчився терміномlogm/2+2 somewhere, for example), in which case dropping the log base would interfere with the runtime analysis.

Another case in which the log base matters is one in which there's some externally-tunable parameter to the algorithm that control the logarithmic base. A great example of this is the B-tree, which requires some external parameter b. The height of a B-tree of order b is Θ(logbn), where the base of the logarithm is significant in that b is not a constant.

Підводячи підсумок, у випадку, коли у вас логарифм із постійною базою, зазвичай (за винятками, як, наприклад, те, що @ gnasher729 вказав), ви можете скинути основу логарифму. Але коли основа логарифму залежить від якогось параметра для алгоритму, це робити зазвичай не безпечно.

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