Що означає


15

Що означає журнал O ( 1 ) nlogO(1)n ?

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

Деякий контекст, речення, де я знайшов його, звучить "[...] ми називаємо функцію [ефективно], якщо вона використовує пробіл O ( log n )O(logn) і не більше часу log O ( 1 ) nlogO(1)n на елемент."


1
Я погоджуюся, що не слід писати подібні речі, якщо тільки не дуже зрозуміло, що це означає (і не повідомляє читачеві, що це таке) і не використовує їх ті самі правила послідовно.
Рафаель

1
Так, слід замість цього записати як ( log ( n ) ) O ( 1 )(log(n))O(1).

1
@RickyDemer Це не те, що робить Рафаель. log b l a h n означає точно ( log n ) b l a h . logblahn(logn)blah
Девід Річербі

4
@Raphael Це стандартні позначення в цій галузі. Кожен, хто знає, знав би, що це означає.
Yuval Filmus

1
@YuvalFilmus Я думаю, що різноманітність невідповідних відповідей є переконливим доказом того, що ваше твердження неправдиве, і що дійсно слід утримуватися від використання таких позначень.
Рафаель

Відповіді:


16

Вам потрібно на мить ігнорувати сильне відчуття, що " О " знаходиться в неправильному місці, і оратись із визначенням незалежно. f ( n ) = log O ( 1 ) n означає, що існують постійні k і n 0 такі, що при всіх n n 0 , f ( n ) log k 1 n = log k n .Of(n)=logO(1)nkn0nn0f(n)logk1n=logkn

Зауважте, що log k n означає ( log n ) k . Функції виду журналу O ( 1 ) п часто називають полілогаріфміческімі , і ви можете чути , як люди кажуть, « е є полілог  пlogkn(logn)klogO(1)nfn

Ви помітите, що легко довести, що 2 n = O ( n ) , оскільки 2 n k n для всіх n 0 , де k = 2 . Вам може бути цікаво, чи 2 log n = log O ( 1 ) n . Відповідь - так, оскільки для досить великого n , log n 2 , тому 2 log n log 2 n для достатньо великих 2n=O(n)2nknn0k=22logn=logO(1)nnlogn22lognlog2nн .n

У відповідній примітці ви часто бачите многочлени, написані як n O ( 1 ) : та сама ідея.nO(1)


Це не підтримується загальною конвенцією про власників місць.
Рафаель

Я відкликаю свій коментар: ви пишете у всіх важливих місцях, чого достатньо.
Рафаель

@Raphael OK. I hadn't had time to check it yet but my feeling was you might be ordering quantifiers differently from the way I am. I'm not actually sure we're defining the same class of functions.
David Richerby

I think you are defining my (2), and Tom defines cR>0{logcn}cR>0{logcn}.
Raphael

9

This is an abuse of notation that can be made sense of by the generally accepted placeholder convention: whenever you find a Landau term O(f)O(f), replace it (in your mind, or on the paper) by an arbitrary function gO(f)gO(f).

So if you find

f(n)=logO(1)nf(n)=logO(1)n

you are to read

f(n)=logg(n)nf(n)=logg(n)n for some gO(1).(1)gO(1).(1)

Note the difference from saying "loglog to the power of some constant": g=n1/ng=n1/n is a distinct possibility.

Warning: The author may be employing even more abuse of notation and want you to read

f(n)O(logg(n)n)f(n)O(logg(n)n) for some gO(1).(2)gO(1).(2)

Note the difference between (1) and (2); while it works out to define the same set of positive-valued functions here, this does not always work. Do not move OO around in expressions without care!


3
I think what makes it tick is that xlogx(n)xlogx(n) is monotonic and sufficiently surjective for each fixed nn. Monotonic makes the position of the OO equivalent and gives you (2) ⇒ (1); going the other way requires gg to exist which could fail if f(n)f(n) is outside the range of the function. If you want to point out that moving OO around is dangerous and doesn't cover “wild” functions, fine, but in this specific case it's ok for the kind of functions that represent costs.
Gilles 'SO- stop being evil'

@Gilles I weakened the statement to a general warning.
Raphael

1
This answer has been heavily edited, and now I am confused: do you now claim that (1) and (2) are effectively the same?
Oebele

@Oebele As far as I can tell, they are not in general, but here.
Raphael

But, something like 3log2n3log2n does not match (1) but does match (2) right? or am I just being silly now?
Oebele

6

It means that the function grows at most as loglog to the power of some constant, i.e. log2(n)log2(n) or log5(n)log5(n) or log99999(n)log99999(n)...


This can be used when the function growth is known to be bounded by some constant power of the loglog, but the particular constant is unknown or left unspecified.
Yves Daoust

This is not supported by the common placeholder convention.
Raphael

2

"At most logO(1)nlogO(1)n" means that there is a constant cc such that what is being measured is O(logcn)O(logcn).

In a more general context, f(n)logO(1)nf(n)logO(1)n is equivalent to the statement that there exists (possibly negative) constants aa and bb such that f(n)O(logan)f(n)O(logan) and f(n)Ω(logbn)f(n)Ω(logbn).

It is easy to overlook the Ω(logbn)Ω(logbn) lower bound. In a setting where that would matter (which would be very uncommon if you're exclusively interested in studying asymptotic growth), you shouldn't have complete confidence that the author actually meant the lower bound, and would have to rely on the context to make sure.


The literal meaning of the notation logO(1)nlogO(1)n is doing arithmetic on the family of functions, resulting in the family of all functions logg(n)nlogg(n)n, where g(n)O(1)g(n)O(1). This works in pretty much the same as how multiplying O(g(n))O(g(n)) by h(n)h(n) results in O(g(n)h(n))O(g(n)h(n)), except that you get a result that isn't expressed so simply.


Since the details of the lower bound are in probably unfamiliar territory, it's worth looking at some counterexamples. Recall that any g(n)O(1)g(n)O(1) is bounded in magnitude; that there is a constant cc such that for all sufficiently large nn, |g(n)|<c|g(n)|<c.

When looking at asymptotic growth, usually only the upper bound g(n)<cg(n)<c matters, since, e.g., you already know the function is positive. However, in full generality you have to pay attention to the lower bound g(n)>cg(n)>c.

This means, contrary to more typical uses of big-oh notation, functions that decrease too rapidly can fail to be in logO(1)nlogO(1)n; for example, 1n=log(logn)/(loglogn)nlogO(1)n

1n=log(logn)/(loglogn)nlogO(1)n
because lognloglognO(1)
lognloglognO(1)
The exponent here grows in magnitude too rapidly to be bounded by O(1)O(1).

A counterexample of a somewhat different sort is that 1logO(1)n1logO(1)n.


Can't I just take b=0b=0 and make your claimed lower bound go away?
David Richerby

1
@DavidRicherby No, b=0b=0 still says that ff is bounded below. Hurkyl: why isn't f(n)=1/nf(n)=1/n in logO(1)nlogO(1)n?
Gilles 'SO- stop being evil'

@Gilles: More content added!

@Gilles OK, sure, it's bounded below by 1. Which is no bound at all for "most" applications of Landau notation in CS.
David Richerby

1) Your "move around OO" rule does not always work, and I don't think "at most" usually has that meaning; it's just redundant. 2) Never does OO imply a lower bound. That's when you use ΘΘ. 3) If and how negative functions are dealt with by a given definition of OO (even without abuse of notation) is not universally clear. Most definitions (in analysis of algorithms) exclude them. You seem to assume a definition that bounds the absolute value, which is fine.
Raphael
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.