Prima di tutto, entrambi gli algoritmi "funzionano" per tutti gli input. La domanda riguarda le prestazioni.
Le risposte a questa domanda sono piuttosto scadenti. Un modo per dire che un algoritmo è asintoticamente più efficiente di un altro è se ci sono delle dimensioni di input (specifiche del problema) in modo tale che per qualsiasi dimensione di input più grande l'algoritmo più efficiente prenderà meno "passi computazionali", di solito con una misura astratta, ad es. numero di confronti.
L'idea delle risposte è che un algoritmo asintoticamente più efficiente potrebbe richiedere ancora più passaggi prima di quella dimensione di input. Esso può essere il caso che l'algoritmo asintoticamente più efficiente richiede meno operazioni per tutti gli ingressi, ma non ha bisogno di essere il caso e in pratica di solito non è. Quindi una migliore formulazione della risposta "corretta" sarebbe " sarà una scelta migliore per tutti gli input tranne possibilmente piccoli input".X
Tuttavia, la formulazione non è poi così eccezionale. Prima di tutto, molti altri fattori vanno a decidere quale algoritmo sia una "scelta migliore", ma darò loro che l'intento è abbastanza chiaro in questo caso. Il vero problema è "piccolo" e "grande". Uno dei miei articoli preferiti è l'algoritmo più veloce e più breve per tutti i problemi ben definiti . Questo documento descrive un algoritmo che ha fornito qualsiasi specifica di una funzione e una prova che può essere calcolata in tempo polinomiale calcolerà quella funzione in una complessità temporale ottimale entro un fattore più un termine additivo. Ad esempio, se gli fornissi un'implementazione di bubble sort come specifica della funzione e la semplice prova che eraO ( n 2 ) O ( n lg n ) 5 c n lg n + o ( n lg n ) c o ( n lg n )5O ( n2), produrrebbe un algoritmo di ordinamento che era . In effetti, produrrebbe un algoritmo che era cui era il fattore costante dell'algoritmo asintoticamente * ottimale. Questo è fantastico C'è solo un problema: il termine costante - nascosto inO ( n lgn )5 c n lgn + o ( n lgn )co ( n lgn )in questo esempio - rende l'algoritmo quasi certamente del tutto impossibile praticamente per qualsiasi problema reale. Cosa intendo con "completamente impossibile"? Voglio dire, la morte per calore dell'universo accadrà molte volte prima che quell'algoritmo venga completato. Tuttavia, per input opportunamente "grandi" sarà più veloce dell'ordinamento a bolle. Il mio punto è che quasi certamente non è fisicamente possibile annotare in alcun modo un input "adeguatamente ampio", figuriamoci calcolare su di esso.
Ad ogni modo, come direi la risposta corretta sarebbe: " richiede meno passaggi di su input sufficientemente grandi". Questo è ancora un po 'vago in quanto vi sono più nozioni di "step" che potrebbero essere applicate e un algoritmo potrebbe essere asintoticamente più efficiente di una metrica e meno efficiente di un'altra. Questa formulazione evita il giudizio di valore di "scelta migliore"; ci sono molte ragioni per scegliere algoritmi asintoticamente meno efficienti o anche algoritmi meno efficienti quando vengono specificati fattori / termini costanti come efficienza della cache o semplicità di implementazione.YXY
* C'è una sottigliezza qui. L'algoritmo asintoticamente ottimale può avere un fattore costante peggiore, , di un algoritmo asintoticamente non ottimale. Penso che avrà il miglior valore di per qualsiasi algoritmo asintoticamente ottimale, ma è ipotizzabile che per ottenere un leggero guadagno nell'efficienza asintotica, si aggiunga un'enorme complessità che aumenta significativamente il fattore costante.ccc