Una complessità temporale Big-Oh può contenere più di una variabile?


11

Diciamo ad esempio che sto eseguendo l'elaborazione di stringhe che richiede un'analisi di due stringhe. Non ho informazioni su quali possano essere le loro lunghezze, quindi provengono da due famiglie distinte. Sarebbe accettabile chiamare la complessità di un algoritmo o O ( n + m ) (a seconda se utilizziamo un algoritmo ingenuo o ottimizzato)?O(nm)O(n+m)

Allo stesso modo, supponiamo che l'algoritmo scelto in realtà richieda due fasi: una fase di impostazione sulla prima stringa che ci consente di elaborare un numero qualsiasi di altre stringhe senza incorrere in quel costo iniziale. Sarebbe appropriato dire che ha una costruzione seguita da un numero qualsiasi di calcoli O ( m ) ?O(n)O(m)

Sarebbe appropriato chiamarli perché entrambi i calcoli sono lineari?O(n)


Vedi i commenti su questa risposta per un piccolo retroscena: il mio rispetto per @corsiKa per aver coraggiosamente posto una domanda così controversa.
OldCurmudgeon,

@OldCurmudgeon, capisco. Odierei guadare quel thread di commenti. Oldcurmudgeon, stai discutendo della notazione big-O senza capire la notazione big-O? Davvero imbarazzante. Inoltre, tu e corsiKa discutete sul tempo di esecuzione senza definire i parametri e m - una ricetta per la comunicazione errata. Suggerimento: una convenzione comune quando si tratta di stringhe è di concordare di usare m per usare la lunghezza di una stringa e n per la lunghezza di un'altra stringa - ma idealmente è probabilmente meglio renderlo esplicito, perché altrimenti può causare confusione (come illustrato qui). nmmn
DW

@DW È possibile che OldCurmudgeon abbia semplicemente imparato una diversa definizione a scuola ... come faccio notare in un commento qui sotto, è possibile evitare più variabili, anche se non ho mai pensato di farlo fino ad ora. Forse questo - o qualcosa del genere - era solito essere standard?
Patrick87,

2
Penso che questo abbia risposte sufficienti qui e qui .
Raffaello

Risposte:


14

Sì, naturalmente. Questo va bene e perfettamente accettabile. È comune e standard vedere algoritmi il cui tempo di esecuzione dipende da due parametri.

Ad esempio, vedrai spesso il tempo di esecuzione della ricerca per profondità espressa in , dove n è il numero di vertici e m è il numero di spigoli nel grafico. Questo è perfettamente valido. Il significato di questo è che esiste una costante c e numeri n 0 , m 0 tali che il tempo di esecuzione dell'algoritmo è al massimo c ( n + m ) , per tutti n > n 0 , m > m 0O(n+m)nmcn0,m0c(n+m)n>n0,m>m0. In altre parole, se il tempo di esecuzione esatto è , diciamo che f ( n , m ) = O ( n + m ) se esiste c , n 0 , m 0 tale che n > n 0 e m > m 0 implica f ( n , m ) c ( n + m )f(n,m)f(n,m)=O(n+m)c,n0,m0n>n0m>m0f(n,m)c(n+m).

Sì, è perfettamente appropriato e accettabile affermare che il primo stadio richiede tempo e il secondo stadio richiede tempo O ( m ) .O(n)O(m)

Importante: assicurati di definire cosa sono e m . Non puoi dire "questo è un algoritmo O ( n ) time" senza specificare cosa sia n . Se n non è specificato nell'istruzione del problema, è necessario specificarlo. Ad esempio, vedi algoritmi grafici, in cui normalmente definiamo n = # di vertici e m = # di bordi.nmO(n)nnn=m=

O(n)m=O(n)m=O(n)m+n=O(n)O(m+n)O(n)m=O(n)O(n)

Questa è roba di base. Lo troverai su tutti i manuali di algoritmi.


1
@OldCurmudgeon, le probabilità sono che troverai esempi di questo in molti manuali di algoritmi standard. Quali hai visto? Hai provato a guardare il capitolo sulla ricerca approfondita (l'esempio che ho citato nella mia risposta)?
DW

2
OO(V+E)(V,E)

2
n

1
Sono d'accordo nella misura in cui tutti usano la notazione Landau in questo modo, ma quasi nessuno sa cosa significhi effettivamente (a meno che non si colleghino i parametri in modo funzionale). Vedi anche l'articolo collegato nella risposta di A. Schulz che inizia affermando che l'uso "di base" e "comune" è sbagliato.
Raffaello

1
@ Patrick87 La teoria della complessità utilizza, in virtù della definizione di molte classi ben note, principalmente la lunghezza dell'input (con notevoli eccezioni). L'analisi dell'algoritmo è - se eseguita seriamente - interessata a imparare qualcosa sull'uso effettivo delle risorse (per quanto consentito dal modello), quindi altri parametri diventano più interessanti da dipingere l'intero quadro (in modo più accurato).
Raffaello
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.