Cosa significa "O (1) tempo di accesso"?


126

Ho visto questo termine "tempo di accesso O (1)" usato per significare "rapidamente" ma non capisco cosa significhi. L'altro termine che vedo con esso nello stesso contesto è "O (n) tempo di accesso". Qualcuno potrebbe spiegare in modo semplice cosa significano questi termini?

Guarda anche


Risposte:


161

Avrai voglia di documentarti sull'Ordine della complessità.

http://en.wikipedia.org/wiki/Big_O_notation

In breve, O (1) significa che richiede un tempo costante, come 14 nanosecondi, o tre minuti, indipendentemente dalla quantità di dati nel set.

O (n) significa che richiede una quantità di tempo lineare con la dimensione del set, quindi un set di dimensioni doppie richiederà il doppio del tempo. Probabilmente non vuoi mettere un milione di oggetti in uno di questi.


66
Per essere pedanti, non significa che il tempo (o il numero di operazioni, ecc.) Sia costante. Significa che esiste una costante tale che il tempo di esecuzione (o il numero di operazioni, ecc.) È limitato sopra dalla costante. Potrebbe esserci ancora una grande variazione nel runtime: ad esempio, int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }is O(1).
jason

Grande intuizione @jason!
Chris Ruskai,

35

In sostanza, significa che ci vuole la stessa quantità di tempo per cercare un valore nella tua collezione sia che tu abbia un piccolo numero di elementi nella tua collezione o moltissimi (entro i limiti del tuo hardware)

O (n) significherebbe che il tempo necessario per cercare un articolo è proporzionale al numero di elementi nella collezione.

Esempi tipici di questi sono gli array, a cui è possibile accedere direttamente, indipendentemente dalla loro dimensione, e gli elenchi collegati, che devono essere attraversati dall'inizio per accedere a un dato elemento.

L'altra operazione solitamente discussa è inserire. Una raccolta può essere O (1) per l'accesso ma O (n) per l'inserimento. Infatti un array ha esattamente questo comportamento, perché per inserire un elemento al centro, dovresti spostare ogni elemento a destra copiandolo nello slot successivo.


21

Ogni risposta che attualmente risponde a questa domanda ti dice che il file O(1) tempo è costante (qualunque cosa accada alla misurazione; potrebbe essere il tempo di esecuzione, il numero di operazioni, ecc.). Questo non è accurato.

Dire che il tempo di esecuzione è O(1)significa che esiste una costante ctale per cui il tempo di esecuzione è delimitato sopra da c, indipendentemente dall'input. Ad esempio, restituire il primo elemento di un array di nnumeri interi è O(1):

int firstElement(int *a, int n) {
    return a[0];
}

Ma anche questa funzione è O(1):

int identity(int i) {
    if(i == 0) {
        sleep(60 * 60 * 24 * 365);
    }
    return i;
}

Il tempo di esecuzione qui è limitato sopra di 1 anno, ma il più delle volte il tempo di esecuzione è dell'ordine dei nanosecondi.

Dire che il tempo di esecuzione è O(n)significa che esiste una costante ctale che il tempo di esecuzione è limitato sopra da c * n, dove nmisura la dimensione dell'input. Ad esempio, trovare il numero di occorrenze di un particolare numero intero in una matrice non ordinata di nnumeri interi mediante il seguente algoritmo è O(n):

int count(int *a, int n, int item) {
    int c = 0;
    for(int i = 0; i < n; i++) {
        if(a[i] == item) c++;
    }
    return c;
}

Questo perché dobbiamo iterare attraverso l'array ispezionando ogni elemento uno alla volta.


19

O (1) significa che il tempo per accedere a qualcosa è indipendente dal numero di elementi nella collezione.

O (N) significherebbe che il tempo per accedere a un articolo è proporzionale al numero (N) di articoli nella collezione.


14

O (1) non significa necessariamente "rapidamente". Significa che il tempo necessario è costante e non basato sulla dimensione dell'input per la funzione. Constant potrebbe essere veloce o lento. O (n) significa che il tempo impiegato dalla funzione cambierà in proporzione diretta alla dimensione dell'input della funzione, indicato con n. Anche in questo caso, potrebbe essere veloce o lento, ma diventerà più lento all'aumentare della dimensione di n.


9

Si chiama notazione Big O e descrive il tempo di ricerca per vari algoritmi.

O (1) significa che il tempo di esecuzione del caso peggiore è costante. Nella maggior parte dei casi, significa che non è necessario cercare nella raccolta, ma è possibile trovare subito ciò che si sta cercando.


Sostituisci "tempo di ricerca" con "tempo di esecuzione peggiore" e sono con te.
Jason Punyon

2
@Seb: Penso che sia stato solo un termine improprio da parte sua, in particolare perché l'OP ha chiesto del tempo di accesso.
jkeys

6

O(1)eseguire sempre nello stesso tempo indipendentemente dal dataset n. Un esempio di O (1) sarebbe un ArrayList che accede al suo elemento con index.

O(n)noto anche come ordine lineare, le prestazioni cresceranno in modo lineare e in proporzione diretta alla dimensione dei dati di input. Un esempio di O (n) potrebbe essere l'inserimento e l'eliminazione di un ArrayList in una posizione casuale. Poiché ogni successivo inserimento / eliminazione in una posizione casuale farà sì che gli elementi nell'ArrayList si spostino a sinistra a destra del suo array interno per mantenere la sua struttura lineare, per non parlare della creazione di un nuovo array e della copia di elementi dal vecchio al nuovo array che richiede tempi di elaborazione costosi, quindi, a detrimento delle prestazioni.


4

"Big O notation" è un modo per esprimere la velocità degli algoritmi. nè la quantità di dati con cui sta lavorando l'algoritmo. O(1)significa che, indipendentemente dalla quantità di dati, verrà eseguito in tempo costante. O(n)significa che è proporzionale alla quantità di dati.


3

Fondamentalmente, O (1) significa che il suo tempo di calcolo è costante, mentre O (n) significa che dipenderà in modo lineare dalla dimensione dell'input - cioè il ciclo attraverso un array ha O (n) - solo loop -, perché dipende dal numero di elementi, mentre il calcolo del massimo tra i numeri ordinari ha O (1).

Anche Wikipedia potrebbe aiutare: http://en.wikipedia.org/wiki/Computational_complexity_theory


3

Il modo più semplice per differenziare O (1) e O (n) è confrontare array e list.

Per array, se hai il valore di indice corretto, puoi accedere immediatamente ai dati. (Se non conosci l'indice e devi scorrere l'array, allora non sarà più O (1))

Per l'elenco, devi sempre scorrere il ciclo indipendentemente dall'indice o meno.


Stavo cercando un esempio di O (1) e solo questa risposta ha la spiegazione.
neelmeg

3

Ecco una semplice analogia; Immagina di scaricare film online, con O (1), se sono necessari 5 minuti per scaricare un film, sarà comunque necessario lo stesso tempo per scaricare 20 film. Quindi non importa quanti film stai scaricando, impiegheranno lo stesso tempo (5 minuti) che si tratti di uno o 20 film. Un normale esempio di questa analogia è quando vai in una libreria di film, sia che tu stia prendendo un film o 5, semplicemente li sceglierai in una volta. Quindi passare lo stesso tempo.

Tuttavia, con O (n), se sono necessari 5 minuti per scaricare un film, saranno necessari circa 50 minuti per scaricare 10 film. Quindi il tempo non è costante o è in qualche modo proporzionale al numero di film che stai scaricando.


1

Significa che il tempo di accesso è costante. Che tu stia accedendo da 100 o 100.000 record, il tempo di recupero sarà lo stesso.

Al contrario, il tempo di accesso O (n) indica che il tempo di recupero è direttamente proporzionale al numero di record da cui si accede.


1

Significa che l'accesso richiede un tempo costante, cioè non dipende dalla dimensione del set di dati. O (n) significa che l'accesso dipenderà dalle dimensioni del set di dati in modo lineare.

La O è anche conosciuta come big-O.


1

Introduzione agli algoritmi: la seconda edizione di Cormen, Leiserson, Rivest & Stein lo dice a pagina 44

Poiché ogni costante è un polinomio di grado 0, possiamo esprimere qualsiasi funzione costante come Theta (n ^ 0) o Theta (1). Quest'ultima notazione è però un abuso minore, perché non è chiaro quale variabile stia tendendo all'infinito. Useremo spesso la notazione Theta (1) per indicare una costante o una funzione costante rispetto a qualche variabile. ... Indichiamo con O (g (n)) ... l'insieme di funzioni f (n) tali che esistano costanti positive c e n0 tali che 0 <= f (n) <= c * g (n) per tutti n> = n0. ... Nota che f (n) = Theta (g (n)) implica f (n) = O (g (n)), poiché la notazione Theta è più forte della notazione O.

Se un algoritmo viene eseguito nel tempo O (1), significa che asintoticamente non dipende da alcuna variabile, il che significa che esiste almeno una costante positiva che quando moltiplicata per uno è maggiore della complessità asintotica (~ runtime) della funzione per valori di n superiori a una certa quantità. Tecnicamente, è l'ora O (n ^ 0).


-2

O (1) significa accesso casuale. In qualsiasi memoria ad accesso casuale, il tempo impiegato per accedere a qualsiasi elemento in qualsiasi posizione è lo stesso. Qui il tempo può essere qualsiasi numero intero, ma l'unica cosa da ricordare è il tempo impiegato per recuperare l'elemento in (n-1) la posizione esima o l'ennesima sarà la stessa (cioè costante).

Considerando che O (n) dipende dalla dimensione di n.


Non ha nulla a che fare con l'accesso casuale - vedi la risposta accettata pubblicata quasi un anno prima di questa risposta per maggiori informazioni
Krease

-3

Secondo la mia prospettiva,

O (1) significa che il tempo per eseguire un'operazione o un'istruzione alla volta è uno, nell'analisi della complessità temporale dell'algoritmo nel migliore dei casi.


6
Impegnati di più. Quella particolare domanda necessita non solo di una prospettiva, ma di una definizione chiara.
Alfabravo
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.