Алгоритмічна інтуїція логарифмічної складності


59

Я вважаю, що я розумію такі складності, як , Θ ( n ) та Θ ( n 2 ) .O(1)Θ(n)Θ(n2)

З точки зору списку, - це постійний пошук, тому це просто отримання голови списку. Θ ( n ) - це те, де я пройду весь список, а Θ ( n 2 ) - лише один раз для кожного елемента списку.O(1)Θ(n)Θ(n2)

Чи існує подібний інтуїтивно зрозумілий спосіб зрозуміти крім того, щоб просто знати, що він лежить десь між O ( 1 ) та Θ ( n ) ?Θ(logn)O(1)Θ(n)


8
log n призначений для "пошуку": думати про бінарний пошук
Суреш,

2
Використовувати для того, щоб задати це питання, неправильно, оскільки воно позначає лише верхню межу. Наприклад, постійний час - O ( log n ) . θ було б більш доречним. Див мета питання: meta.cs.stackexchange.com/questions/182 / ...OO(logn)θ
Aryabhata


Невелика примітка: У класичних налаштуваннях машини Тьюрінга всі алгоритми є , оскільки їм потрібно прочитати кожен символ вхідної інформації хоча б один раз. Двійковий пошук можна здійснити в O ( log n ), оскільки ми обіцяємо, що, наприклад, список буде відсортований. Ω(n)O(logn)
chazisop

1
Пізній внесок: за визначенням, логарифм числа числа n - це лише кількість разів, коли ви множите b на себе, щоб отримати n . b l = nbnbn . Наприклад, 2 3 = 8bl=nl=logb(n) . Отже, якщо у вас є число n і ви хочете дізнатися, що l o g b ( n ) = ? просто продовжуйте ділити його на b, поки ви не досягнете 1 (припустимо, що n є силою b для простоти). Кількість поділів дорівнює l o g b ( n ) . Алгоритми, що демонструють цю поведінку поділу, мають час виконання в O ( l o g23=8log2(8)=3nlogb(n)=?b1nblogb(n) . O(log(n))
saadtaame

Відповіді:


53

складність, як правило , пов'язані з підрозділом. Використовуючи списки як приклад, уявіть список, елементи якого відсортовані. Ви можете шукати в цьому списку в O ( log n ) час - вам насправді не потрібно дивитись на кожен елемент через сортовану природу списку.Θ(logn)O(logn)

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

Ви можете бачити, що список фактично наполовину зменшує кожен крок. Це означає, що якщо ви отримаєте список довжиною , максимум кроків, необхідних для досягнення списку з одним елементом, становить 5 . Якщо у вас є список з 128 = 2 7 елементів, вам потрібно лише 7 кроків, для списку 1024 = 2 10 вам потрібно лише 10 кроків і т.д.325128=2771024=21010

Як бачимо, показник у 2 n завжди показує кількість необхідних кроків. Логарифм використовується для "вилучення" саме цього показника, наприклад, log 2 2 10 = 10 . Він також узагальнює перелік довжин, які не є силами двох довгих.n2nlog2210=10


4
Слід зазначити, що це лише в тому випадку, O(log n)якщо до списку є постійний час випадковий доступ. Що стосується більш типових реалізацій списку (пов'язані списки), цеO(n log n)
asm

1
Двійковий пошук не працює у списках на відсутність покажчиків; зазвичай це робиться на масивах.
Рафаель

Двійковий пошук добре працює у списках. Це просто безглуздо через те, що набагато складніше, ніж потрібно / корисне / практичне.
Антон

@AndrewMyers Точніше шукати пов’язаний список O(n)
phant0m

1
@ phant0m Так, я трохи взяв мене, щоб зрозуміти, що припускаєш, що ти рухаєшся з поточної позиції, а не переходиш від початку кожен раз.
асм

38

З точки зору (збалансованих) дерев (скажімо, бінарного дерева, тому всі є базою 2):log

  • отримує корінь дереваΘ(1)
  • - прогулянка від кореня до листаΘ(logn)
  • обходить усі вузли дереваΘ(n)
  • - дії на всі підмножини двох вузлів на дереві, наприклад, кількість різних шляхів між будь-якими двома вузлами.Θ(n2)
  • - узагальнення вищезазначеного для будь-якого підмножини k вузлів (для постійної k )Θ(nk)kk
  • - дії на всі можливі підмножини вузлів (підмножини всіх можливих розмірів, тобто k = 1 , 2 , , n .). Наприклад, кількість різнихпіддерев'я дерев.Θ(2n)k=1,2,,n

5
Щоб додати до цього, інтуїція для походить від двох речей: 1.) Повторність T ( n ) = T ( Θ(loglogn)і 2.) Двійковий пошук за чимось розміромlog(n),тобто двійковим пошуком по висоті дерева. T(n)=T((n))+1log(n)
mcorley

17

Щоб був можливим, ви повинні мати можливість зменшити розмір проблеми пропорційно на деяку довільну суму стосовно n при постійній роботі часу.O(logn)n

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

Тепер чи потрібно скоротити розмір проблеми вдвічі, насправді ні. Алгоритм - це навіть якщо він може скоротити простір пошуку проблеми на 0,0001%, якщо відсоток і операція, яку він використовує для скорочення розміру проблеми, залишаються постійними, це алгоритм O ( log n ) , це не буде швидким алгоритмом, але це все-таки O ( log n ) з дуже великою постійною. (Припустимо, що ми говоримо про журнал n з базовим 2 журналом)O(logn)O(logn)O(logn)logn


1
Що було б, якби "знижувальна сума" не була постійною?
Свиш

O(logn)

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

8

n

while n != 0:
   print n%2, 
   n = n/2

whilelog(n)


1
lognO(f(s))ss=lognO(s)

@jmad Справа. Але цей приклад дає вам інтуїцію у log (n).
Pratik Deoghare

@jmad Я міг би використовувати алгоритм і для генерування випадкових чисел, але я хотів, щоб це було максимально просто.
Pratik Deoghare

8

log(n)1n1nlog(n)

100210021002100100210021002100

10021001002100210021001002100log(n)n

Звідки беруться експоненція та логарифми? Чому вони викликають такий великий інтерес до інформатики? Ви можете не помітити, але експоненція є скрізь. Ви сплатили відсотки по кредитній картці? Ви щойно заплатили Всесвіту за свій дім (Не так вже й погано, але крива підходить). Мені подобається думати, що експоненція походить від правила продукту, але інші можуть запропонувати більше прикладів. Що таке правило про товар, ви можете запитати; І я відповім.

ABCBCACDCAD2342421010242101010210101024

log2(n)nn2n2logb(n)bbnlog(n)nn

log(n)n


3
log(n)

3
Я намагався дати інтуїцію, наскільки вона маленька.
Раві

5

O(logn)x

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



1

Інтуїція полягає в тому, скільки разів ви можете вдвічі зменшити число, скажімо, n, перш ніж воно зменшиться до 1 - це O (lg n).

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

2^0+2^1+...+2^h = n

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