Che cos'è un algoritmo efficiente?


10

Dal punto di vista del comportamento asintotico, che cosa è considerato un algoritmo "efficiente"? Qual è lo standard / motivo per disegnare la linea in quel punto? Personalmente, penso che tutto ciò che è ciò che potrei chiamare ingenuamente "sub-polinomiale", in modo tale che come sia efficiente e tutto ciò che è sarebbe "inefficiente". Tuttavia, ho sentito tutto ciò che è di qualsiasi ordine polinomiale essere definito efficiente. Qual è il ragionamento?n 1 + ϵ Ω ( n 2 )f(n)=o(n2)n1+ϵΩ(n2)


Risposte:


11

Dipende dal contesto. Nell'informatica teorica, di solito ogni algoritmo temporale polinomiale è considerato "efficiente". Negli algoritmi di approssimazione, ad esempio, un runtime di sarebbe considerato efficiente, anche se in pratica non sarà utilizzabile per un valore ragionevole di . Un algoritmo per SAT che gira in sarebbe una svolta incredibile. ϵ n 2 100n1/ϵ1/ϵϵn2100

Nell'algoritmo classico, vale a dire algoritmi degli anni '80 e precedenti, i tempi di esecuzione inferiori a o giù di lì (si pensi alla moltiplicazione della matrice, alla corrispondenza dei costi minimi, ai flussi, alla programmazione lineare) sono considerati efficienti. Sono ancora considerati efficienti dalla maggior parte delle persone, direi. Naturalmente un algoritmo non è considerato efficiente se è noto un algoritmo , come per esempio l'ordinamento.n 2 n log nn3n2nlogn

Oggi c'è una tendenza verso algoritmi sublineari o algoritmi di streaming in grado di gestire terabyte di dati. Prova a utilizzare la moltiplicazione matriciale per calcolare il ranking di tutte le pagine nell'indice di Google. Non funzionerà

Naturalmente, sebbene certamente utile, il runtime asintotico di un algoritmo non racconta l'intera storia. Esistono algoritmi che hanno un buon runtime asintotico, ma costanti che sono così enormi da non poter essere effettivamente utilizzate. Mai. Lipton li chiama algoritmi galattici . Robert Sedgewick afferma persino che i limiti del caso peggiore sono "spesso inutili per la previsione, spesso inutili per le garanzie" e "l'analisi del caso peggiore è inutile per predire le prestazioni" nel suo discorso " Riportare la scienza nell'informatica" .


9
In breve: efficiente è ciò che risolve il problema in un lasso di tempo adatto a te.
Raffaello

Questo non richiede davvero la propria risposta, ma BPP, che è la classe di funzioni con runtime polinomiale (come descritto nella risposta) con casualità, viene spesso considerata efficiente. In altre parole, quanto sopra è giusto, ma i computer sono generalmente autorizzati ad accedere alla casualità per fare calcoli. Uno degli usi pratici più importanti della casualità è l'hashing.
SamM

Forse "efficiente" non è davvero la terminologia giusta in primo luogo? Stavo solo rivedendo uno dei miei libri di calcolo, e l'autore definisce i runtime polinomiali "trattabili" e i runtime esponenziali "intrattabili".
Robert S. Barnes,

1
@ RobertS.Barnes: parole diverse, stesso problema.
Raffaello

4

O(logcn)c>0 O(logn)


3

Il ragionamento alla base è che, dal punto di vista del comportamento asintotico, un tasso di crescita polinomiale è banalmente inferiore a un tasso di crescita super-polinomiale. In pratica, un algoritmo temporale polinomiale funziona molto più velocemente di un algoritmo temporale polinomiale quando le dimensioni dell'input aumentano.

O(n2000)O(n5)

O(n2)


3

In teoria, si dice che un algoritmo sia efficace se il suo tempo di esecuzione nel caso peggiore è limitato da un polinomio nella sua lunghezza di input. Il ragionamento è che i polinomi hanno buone proprietà di chiusura. L'aggiunta, la moltiplicazione e la composizione di polinomi sono operazioni che producono polinomi e sono utili se si riducono i problemi l'uno con l'altro.

Naturalmente il divario tra polinomio ed esponenziale diventa molto grande all'aumentare della lunghezza dell'input, quindi gli algoritmi del tempo polinomiale sono molto migliori. In pratica, un algoritmo a tempo polinomiale potrebbe richiedere molto tempo prima della terminazione, ma potrebbe essere il caso che sia un algoritmo ottimale (il migliore possibile) nel qual caso direi che è efficiente.


Mentre posso capire che se qualcosa è l'algoritmo più veloce conosciuto per un particolare problema, allora potrebbe essere considerato "efficiente" da quel punto di vista, è difficile per me pensare a tutto ciò che funziona nel polytime come efficiente. :-)
Robert S. Barnes,

Per i runtime polinomiali, "efficiente" è solo una parola, e fuorviante in questo.
Raffaello

@Raphael Forse trattabile è una parola migliore da usare ...?
Robert S. Barnes,

1
@ RobertS.Barnes: non molto meglio, imho. "Tractable" è tanto relativo quanto "efficiente".
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.