Per chiarire la discussione nei commenti, è importante ciò a cui stai misurando la crescita.
Come menzionato da @Kaveh, non è lineare in entrambi allo stesso tempo, ma è lineare se uno è una costante e l'altro cresce.O ( m n )
D'altra parte, sarebbe probabilmente considerato lineare. Intuitivamente, se m raddoppia, o se raddoppia, o anche se e raddoppiano, non può più del doppio. Questo non è vero per ; se e entrambi double aumentano di 4. Ecco perché in molti contesti questo tempo di esecuzione sarebbe considerato quadratico. Ne faccio un esempio con la corrispondenza delle stringhe in un paio di paragrafi.O ( m + n )mm n m + n m n m n m nnmnm + nm nmnm n
Ma di solito quando usi la notazione Big- , la usi in riferimento a qualcosa in particolare. Dato che siamo principalmente teorici, è generalmente la dimensione dell'input al problema.O
Prendiamo Matrix Addition, per esempio. L'aggiunta di due matrici richiede tempo O ( m n ) . Ma ogni elemento del nostro input viene toccato solo una volta, quindi questo di solito sarebbe chiamato lineare. In altre parole, il nostro input è di dimensione O ( m n ) , quindi un tempo di esecuzione di O ( m n ) è lineare nella dimensione dell'input.m × nO ( m n )O ( m n )O ( m n )
Ora diamo un'occhiata alla corrispondenza delle stringhe - vale a dire, ci viene data una stringa di dimensione e una stringa di dimensione n e vogliamo vedere se c'è una ricorrenza della stringa più piccola all'interno della stringa più grande. Possiamo verificarlo ingenuamente in O ( m n ) tempo; questo sarebbe generalmente considerato quadratico. Perché? Se m e n possono essere qualsiasi cosa, impostare m = n . Quindi il nostro tempo di esecuzione è O ( m 2 ) e il nostro input è di dimensioni 2 m .mnO ( m n )mnm = nO ( m2)2 m
D'altra parte, se utilizziamo l' algoritmo Rabin-Karp , otteniamo (in media) tempo . Il nostro input consisteva in entrambe le stringhe, quindi anche il nostro input era di dimensione O ( m + n ) . Pertanto, questo sarebbe generalmente indicato come lineare.O ( m + n )O ( m + n )
Per riassumere: è generalmente chiamato lineare per cose come la moltiplicazione di matrici perché è lineare nella dimensione dell'input, ma generalmente è chiamato quadratico per cose come la corrispondenza delle stringhe a causa dell'input più piccolo. Il termine appropriato dipende dal contesto in cui lo si utilizza.O ( m n )