Чи є Big O (logn) log base e?


96

Для бінарного дерева типу структур даних я бачу, що позначення Big O зазвичай позначається як O (logn). З малої букви «l» в журналі, чи означає це підставу журналу e (n), як це описано натуральним логарифмом? Вибачте за просте запитання, але у мене завжди були проблеми з розмежуванням різних передбачуваних логарифмів.


58
Як заперечують інші, це не має значення. Всі логарифми відрізняються один від одного константою, залежною лише від задіяних основ. Оскільки ці фактори є постійними, вони не мають значення для цілей асимптотичного аналізу. По-друге, що стосується визначення передбачуваної бази, це залежить від контексту. Як приблизне правило використовуйте наступне: 1. Коли математик пише, log nвін має на увазі природний логарифм. 2. Коли комп'ютерист пише, log nвін має на увазі базу-дві. 3. Коли інженер пише, log nвін має на увазі базу-десять. Зазвичай це правда.
jason

4
@ Джейсон, ще одна умова (в рамках математики) полягає в тому, що ln n означає природний логарифм, а log n - десять баз. Think ln розшифровується як французький "logarithm naturelle".
Інтернет-людина

2
Основою логарифму є кількість дочірніх елементів кожного вузла. Якщо це двійкове дерево, то це журнал основи 2.
Пол

3
Я ціную вашу відповідь, Джейсоне, і тут є над чим подумати. Коли я досліджував, в якій базі знаходиться журнал (я припустив 2), я побачив ту саму відповідь: це не має значення, оскільки ви можете усунути константу, log_10 (2). Моя проблема з цим полягає в тому, що, наприклад: 5 log_10 (5) <5, тоді як 5 log_2 (5)> 5. Я швидко ввів їх у свій розрахунок, щоб допомогти зрозуміти, де O (n logn) має кращий або гірший час роботи, ніж O (n). Залежно від основи це має значення. Тому я справді думаю, що ПРАВИЛЬНОЮ відповіддю на це має бути те, що журнал контекстуально означає базу 2 у більшості програм інформатики.
Даг Мід

@jason, я б сказав, що простіше використовувати ln (інтерпретація математика);). Інші два приклади є обґрунтованими.
Белфорд,

Відповіді:


77

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

Крім того, як на мою думку, для вашого прикладу краще писати O (log 2 N), оскільки це краще повідомляє виведення часу роботи алгоритму.

У нотації big-O () постійні фактори видаляються. Перетворення з однієї бази логарифму в іншу передбачає множення на постійний коефіцієнт.

Отже, O (log N) еквівалентно O (log 2 N) через постійний коефіцієнт.

Однак, якщо ви можете легко набрати журнал 2 N у своїй відповіді, це більш педагогічно. У разі пошуку в двійковому дереві ви маєте рацію, що log 2 N вводиться під час виведення середовища виконання big-O ().

Перш ніж виражати результат як нотацію big-O (), різниця дуже важлива. При виведенні полінома, який повинен передаватися через нотацію big-O, було б неправильним для цього прикладу використовувати логарифм, відмінний від log 2 N, перед застосуванням нотації O (). Як тільки поліном використовується для передачі найгіршого часу виконання за допомогою позначення big-O (), не має значення, який логарифм використовується.


4
Але дуже легко показати, що log_2 nє Θ(log_a n)для будь-якої бази a, тому я не впевнений, що бачу, як використання бази 2 "правильніше".
bcat

1
Kinopkio та bcat, дякую, що допомогли йому стати корисними. Спочатку це було не дуже добре написано. :)
Heath Hunnicutt

2
Ну, я додав ясності, але я впевнений, що мені боляче, що ви думаєте, що моя відповідь може заплутати людей. Насправді, більшість відповідей тут не враховували інтуїцію ОП і намагалися навчити його багато чому. Я не настільки вражений конкуренцією, мені сумно через низький рівень педагогіки.
Heath Hunnicutt

11
"під час виведення полінома O () у випадку двійкового пошуку правильним є лише log2." -1 для поганої математики. Визначення x (n) ~ O (f (n)) говорить, що існує така константа c, що c * (f (n)) <x (n) для всіх n> n_0. Таким чином, постійний коефіцієнт абсолютно не має значення під час аналізу.
rlbond

3
Оскільки log2 (x) дорівнює log10 (x) / log10 (2), ви можете отримати його в будь-який спосіб. Журнал не є строго базовим 2 у будь-який момент.
rlbond

80

На великі позначення О не впливає логарифмічна основа, оскільки всі логарифми в різних базах пов'язані постійним коефіцієнтом , що O(ln n)еквівалентно O(log n).

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


2
графіка акуратна, але подумайте про виведення полінома O () - перед тим, як застосовувати O (), для двійкового пошуку правильним є лише log-base-2.
Heath Hunnicutt

1
@Heath Hunnicutt: No. log_2 xвідрізняється від log_b xпостійного коефіцієнта c(b)для будь-якої бази, що не bзалежить від x.
jason

4
Але чому ви говорите про це, коли це не має відношення до питання і лише заплутує?
hobbs

4
Хоббс: Тому що саме цей факт є причиною, за якою ОП надихнувся запитати. Я намагаюся зв'язати його ідеї з відповіддю, щоб він зрозумів, чому у нього була його інтуїція, чому це не стосується O (), але не надмірно застосовувати те, що він дізнається тут, до похідної частини аналізу. Стислі відповіді, які не стосуються першопричини непорозуміння, можуть призвести до подальшого непорозуміння. Це погана педагогіка.
Heath Hunnicutt

4
@Heath Hunnicutt: Якщо ви проводите асимптотичний аналіз, це не має значення. Те, що ви чекаєте до останньої хвилини, щоб вкинути великі цифри O, не змінює того факту, що я можу множити і ділити всі свої логарифми на якусь безглузду константу і змінювати базу на всіх кроках. Тобто, якщо у мене є якийсь аналіз, який передбачає log_2 n, я можу просто зайти і замінити log_2 nскрізь до, log_pi 2 * log_2 n / log_pi 2а потім просто закінчити аналізом, який має log_pi 2 * log_pi nвсюди. Зараз мій аналіз з точки зору log_pi n.
Джейсон

9

Насправді не має значення, яка це база, оскільки нотація big-O зазвичай пишеться, показуючи лише асимптотично вищий порядок n, тому постійні коефіцієнти відпадають. Оскільки інша основа логарифму еквівалентна постійному коефіцієнту, вона є зайвою.

Тим не менш, я б, мабуть, припустив журнал 2.


@Kinopiko: Що саме в цьому не так? Точніше, чим моя відповідь фактично відрізняється від вашої та інших тут?
Деніел Прайден,

Ах, можливо, моя помилка у використанні "коефіцієнта". Редагуватиму, щоб уточнити.
Даніель Приден

Це було моє головне питання з вашою відповіддю. Крім того, трохи незрозуміло, що ви маєте на увазі під "вони все одно матимуть певний ефект". Якийсь вплив на що?
bcat

1
Ваша відповідь обговорює найвищі коефіцієнти порядку. Те, що ви сказали, є правильним, наскільки це можливо, але це не причина того, що основа логарифму не має значення. Причина полягає в тому, що різниця між різними базовими логарифмами є константою, яка поглинається O ().

1
@Kinopiko: Добре. Я думаю, ми говоримо одне і те ж. Я б сказав O (100) = O (1), оскільки O (100) = O (100 * 1) = O (C * 1) = O (1). Що я мав на увазі, коли постійні вирази є зайвими. Тобто порядок з будь- константи дорівнює 1.
Daniel Pryden

7

Обидва вірні. Подумайте про це

log2(n)=log(n)/log(2)=O(log(n))
log10(n)=log(n)/log(10)=O(log(n))
logE(n)=log(n)/log(E)=O(log(n))

2

Так, говорячи про нотації великих значень, база не має значення. Однак обчислювально, коли стикається з реальною проблемою пошуку, це має значення.

При розробці інтуїції про деревоподібні структури корисно зрозуміти, що в бінарному дереві пошуку можна здійснювати пошук за час O (n log n), оскільки це висота дерева - тобто в бінарному дереві з n вузлами дерево глибина - O (n log n) (основа 2). Якщо кожен вузол має трьох дітей, дерево все ще можна шукати за час O (n log n), але з логарифмом 3. Обчислювально, кількість дочірніх елементів кожного вузла може мати великий вплив на продуктивність (див. Наприклад: текст посилання )

Насолоджуйтесь!

Пол


Ви мали на увазі сказати, що висота двійкового дерева - це log n, а не n log n, так?
камера


1

Спочатку ви повинні зрозуміти, що означає для функції f (n) бути O (g (n)).

Формальне визначення: * Функцією f (n) називають O (g (n)) iff | f (n) | <= C * | g (n) | коли n> k, де C і k - константи. *

отже, нехай f (n) = log log a n, де a> 1 і g (n) = log log b n, де b> 1

ПРИМІТКА. Це означає, що значення a та b можуть бути будь-якими значеннями, більшими за 1, наприклад a = 100 та b = 3

Тепер ми отримуємо наступне: log log a of n називається O (log log b of n) iff | log base a of n | <= C * | журнал бази b з n | коли n> k

Виберіть k = 0, а C = log основа a з b.

Тепер наше рівняння виглядає так: | log base a of n | <= log base a of b * | log base b of n | коли n> 0

Зверніть увагу на праву сторону, ми можемо маніпулювати рівнянням: = log base a of b * | log base b of n | = | журнал бази b з n | * log log a of b = | log base a of b ^ (log log b of n) | = | журнал бази a з n |

Тепер наше рівняння виглядає так: | log base a of n | <= | журнал бази a з n | коли n> 0

Рівняння завжди відповідає дійсності, незалежно від того, якими є значення n, b або a, крім обмежень a, b> 1 та n> 0. Отже, логарифмова база a з n дорівнює O (log log b з n), а оскільки a, b не має значення, ми можемо їх просто опустити.

Ви можете побачити відео на YouTube тут: https://www.youtube.com/watch?v=MY-VCrQCaVw

Ви можете прочитати статтю про це тут: https://medium.com/@randerson112358/omitting-bases-in-logs-in-big-o-a619a46740ca

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