Per fare un esempio banale, non è possibile trovare il numero più grande da un insieme di numeri senza controllarli tutti che richiedono tempo lineare. Nessuna grande prova. Ma ci sono algoritmi che non richiedono sempre la lettura di tutti i dati. Un buon esempio è la ricerca di tutte le occorrenze di un pattern in una stringa, che potrebbe non richiedere la lettura dell'intera stringa (algoritmo di Boyer-Moore). Ma non dovrei ripetere ciò che è già stato risposto, probabilmente meglio di quanto farei.n
Tuttavia, c'è un punto nella domanda che richiede alcune ulteriori osservazioni relative al limite inferiore (o ai limiti di complessità in generale).
In realtà la scelta di ciò che è un singolo passo computazionale è irrilevante, purché si possa considerare che i passi computazionali abbiano un limite superiore costante (e limite inferiore). Il risultato della complessità sarà lo stesso poiché è definito fino a una costante. Prendere 3 confronti come operazioni unitarie, o solo una singola, non fa differenza.
Lo stesso vale per la dimensione dei dati che serve da riferimento per valutare il costo del calcolo. Prendere un singolo numero intero o due numeri interi come unità di misura non fa differenza.
Tuttavia, le due scelte devono essere correlate.
Si può considerare che un numero è una singola unità di dati se si considera che le operazioni su numeri interi, come l'addizione o il confronto, sono operazioni di unità. Puoi anche considerare che si tratta di unità di dati poiché ci vogliono cifre per rappresentare un numero. Quindi, naturalmente, l'aggiunta e il confronto non sono più operazioni unitarie e il loro costo dipende dai valori degli operandi.nlognO ( logn )
Il fatto che un'operazione possa essere considerata con un costo unitario è strettamente correlato a quali dati possono essere considerati di dimensioni unitarie. E questo dipende dal livello di astrazione che scegli per il tuo modello di calcolo.