Come si collegano O e Ω al caso peggiore e migliore?


33

Oggi abbiamo discusso in una lezione un algoritmo molto semplice per trovare un elemento in un array ordinato usando la ricerca binaria . Ci è stato chiesto di determinare la sua complessità asintotica per una serie di n elementi.

La mia idea era, che è obvisously O(logn) , o O(log2n) per essere più precisi, perché log2n è il numero di operazioni nel caso peggiore. Ma posso fare di meglio, ad esempio se colpisco l'elemento cercato per la prima volta, allora il limite inferiore è Ω(1) .

Il docente ha presentato la soluzione come Θ(logn) poiché di solito consideriamo solo gli input peggiori per gli algoritmi.

Ma considerando solo i casi peggiori, qual è il punto di avere la notazione O e Ω quando tutti i casi peggiori di un dato problema hanno la stessa complessità ( Θ sarebbe tutto ciò di cui abbiamo bisogno, giusto?).

Cosa mi sto perdendo qui?


@Smaji: Cosa intendi con "Ma se consideri solo i casi peggiori, qual è il punto di avere una grande O e una grande notazione Omega quando tutti i casi peggiori hanno + - la stessa complessità (Theta sarebbe tutto ciò di cui abbiamo bisogno, giusto?)." per favore chiariscilo.
tanmoy,

@Smajl: Penso che la tua domanda sia: qual è la necessità della notazione Big O e Big Omega nell'analisi dell'algoritmo? ho ragione?
tanmoy,

5
O(log2n) non è più specifico diO(logn) , indicano la stessa classe di funzioni.
Raffaello

log2(n) è uguale alog(b)/log(2)×logb(n) pertanto il 2 indica solo un fattore che può essere rimosso (come altri fattori in grande -O.
ctrl-alt-Delor

Risposte:


39

La notazione di Landau indica limiti asintotici sulle funzioni . Vedi qui per una spiegazione delle differenze tra , Ω e Θ .OΩΘ

I tempi peggiori, migliori, medi o nominali descrivono funzioni di runtime distinte: una per la sequenza di runtime più alta di qualsiasi dato , una per quella del più basso, e così via.n

Di per sé, i due non hanno nulla a che fare l'uno con l'altro. Le definizioni sono indipendenti. Ora possiamo andare avanti e formulare limiti asintotici sulle funzioni di runtime: superiore ( ), inferiore ( Ω ) o entrambi ( Θ ). Possiamo fare sia nel caso peggiore, migliore o in qualsiasi altro caso.OΩΘ

Ad esempio, nella ricerca binaria si ottiene un asintotico di runtime nel caso migliore di e un asintotico nel caso peggiore di Θ ( log n ) .Θ(1)Θ(logn)


La chiave per me è che possiamo fare analisi peggiori, nel migliore dei casi, su qualsiasi funzione asintotica limitata. Per me, ciò dimostra l'indipendenza di Big O rispetto all'analisi del caso peggiore. Grazie!
Patrick,

1
@Patrick Non proprio. Innanzitutto, decidi se vuoi analizzare il caso peggiore, medio o migliore. Quindi ti viene in mente la funzione di costo (o un'approssimazione più che puoi). Solo allora prendi gli asintotici, se non del tutto.
Raffaello

17

Considera il seguente algoritmo (o procedura, o pezzo di codice, o altro):

Contrive(n)
1. if n = 0 then do something Theta(n^3)
2. else if n is even then
3.    flip a coin
4.    if heads, do something Theta(n)
5.    else if tails, do something Theta(n^2)
6. else if n is odd then
7.    flip a coin
8.    if heads, do something Theta(n^4)
9.    else if tails, do something Theta(n^5)

Qual è il comportamento asintotico di questa funzione?

nΩ(n)O(n2)Θ

nΩ(n4)O(n5)Θ

n=0Θ(n3)

Θ


1
nmod4

4

Non necessariamente. In questo caso, vale a dire la ricerca binaria su un array ordinato, puoi vedere che: (a) la ricerca binaria richiede al massimo passaggi; (b) ci sono input che effettivamente costringono questo molti passaggi. Quindi, se è il tempo di esecuzione di un input nel caso peggiore per la ricerca binaria, puoi dire che .[logn+1]T(n)T(n)=Θ(logn)

D'altra parte, per altri algoritmi, potresti non essere in grado di elaborare esattamente , nel qual caso potresti avere uno spazio tra i limiti superiore e inferiore per il tempo di esecuzione su un input nel caso peggiore.T(n)

Ora, per la ricerca di una matrice ordinata, qualcosa di più è vero, ovvero che qualsiasi algoritmo per la ricerca di una matrice ordinata deve ispezionare . Per questo tipo di limite inferiore, tuttavia, è necessario analizzare il problema stesso. (Ecco l'idea: in qualsiasi momento, un algoritmo di ricerca non ha escluso alcuni insiemi di posizioni in cui può essere l'elemento che sta cercando. Un input accuratamente elaborato può quindi garantire che sia ridotto al massimo di un fattore ).[logn+1]S[n]|S|2


1

Hai ragione, molte persone usano sciatto quando dovrebbero usare . Ad esempio, un analista algoritmo può finire con una funzione temporale e concludere immediatamente che , che è tecnicamente giusto , ma un'affermazione più nitida sarebbe . Attribuisco questo comportamento ignaro a due ragioni. Primo, molti vedono come più popolare e accettabile, forse a causa della sua lunga storia. Ricordiamo che è stato introdotto più di un secolo fa, mentre (e ) sono stati introdotti solo nel 1976 (da Donald Knuth). In secondo luogo, potrebbe essere perchéOΘT(n)=n2+n+2T(n)=O(n2)T(n)=Θ(n2)OΘΩOè prontamente disponibile sulla tastiera, mentre non lo è!Θ

Da un punto di vista tecnico, tuttavia, il motivo principale per cui gli analisti attenti preferiscono usare over è che il primo copre "un territorio maggiore" rispetto al secondo. Se prendiamo il tuo esempio di ricerca binaria e vogliamo usare , dovremo fare due affermazioni: \ una per il caso migliore, ovvero e un'altra per il caso peggiore, vale a dire . Con , facciamo una sola affermazione, vale a dire . Matematicamente, anche le funzioni coperte da sono coperte da , mentre il contrario non è necessariamente vero.OΘΘΘ(1)Θ(logn)OO(logn)ΘO


Benvenuto e grazie per aver dedicato del tempo a pubblicare una risposta! Tuttavia, non posso dire quale sia il tuo punto qui. Nel primo paragrafo, offri alcune speculazioni. Nel secondo, proponete un punto di vista che è "sciatto" stesso: dire "è il caso medio " non dice nulla sul caso migliore, tranne che è nella stessa classe. Dire "è caso medio" implica lo stesso limite superiore! Se desideri fornire ulteriori informazioni sul caso migliore, dovrai fornirle in modo esplicito in entrambi i modi. Pertanto, non vedo come stai cercando di usare O su Θ. O(logn)Θ(logn)
Raffaello

@Raphael Ti rimando alle definizioni delle due notazioni. Inoltre, renditi conto che sono usati per classificare il "tasso di crescita" asintotico del tempo di esecuzione, non il tempo di esecuzione stesso propagato dalle tue varie risposte e dai tuoi commenti.
Hamed Nassar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.