Mi piace molto l'esempio del libro Introduzione agli algoritmi , che illustra il significato dell'efficienza dell'algoritmo:
Confrontiamo due algoritmi di ordinamento: ordinamento inserzione e unione ordinamento . La loro complessità è e O (n \ log n) = c_2n \ lg n rispettivamente. In genere unisci ordinamento ha un fattore costante più grande, quindi supponiamo che c_1 <c_2 . O ( n log n ) = c 2 n lg n c 1 < c 2O ( n2) = c1n2O ( n logn ) = c2n lgnc1< c2
Per rispondere alla tua domanda, valutiamo i tempi di esecuzione di un computer più veloce (A) che esegue l'algoritmo di ordinamento di inserzione rispetto a un computer più lento (B) che esegue l'algoritmo di ordinamento di tipo merge.
Assumiamo:
- la dimensione del problema di input è di 10 milioni di numeri: ;n = 107
- il computer A esegue istruzioni al secondo (~ 10GHz);1010
- il computer B esegue solo istruzioni al secondo (~ 10MHz);107
- i fattori costanti sono (ciò che è leggermente sopravvalutato) e (in realtà è più piccolo).c 2 = 50c1= 2c2= 50
Quindi con questi presupposti ci vuole
107
2⋅(107)2 instructions1010 instructions/second=2⋅104 seconds
per il computer A per ordinare numeri e
107
50⋅107lg107 instructions107 instructions/second≈1163 seconds
per il computer B.
Quindi il computer, che è 1000 volte più lento, può risolvere il problema 17 volte più velocemente. In realtà il vantaggio di unire l'ordinamento sarà ancora più significativo e aumenterà con la dimensione del problema. Spero che questo esempio aiuti a rispondere alla tua domanda.
Tuttavia, non si tratta solo della complessità dell'algoritmo. Oggi è quasi impossibile ottenere un aumento di velocità significativo solo utilizzando la macchina con una frequenza della CPU più elevata. Le persone devono progettare algoritmi per sistemi multi-core che si adattano bene. Anche questo è un compito complicato, perché con l'aumento dei core, aumenta anche un sovraccarico (per la gestione degli accessi alla memoria, ad esempio). Quindi è quasi impossibile ottenere uno speedup lineare.
Quindi, per riassumere, la progettazione di algoritmi efficienti oggi è altrettanto importante di prima, perché né l'aumento di frequenza né i core aggiuntivi ti daranno la velocità rispetto a quella introdotta dall'algoritmo efficiente.