Nella maggior parte dei nostri problemi, abbiamo a che fare con grandi elenchi di numeri che si adattano comodamente ai tipi di dati int / float standard. A causa del modo in cui la maggior parte dei processori è costruita per gestire numeri di 4-8 byte alla volta senza costi aggiuntivi (rispetto ai numeri che rientrano, diciamo, 1 byte), raramente riscontriamo un cambiamento nel tempo di esecuzione dal ridimensionamento dei nostri numeri o all'interno di intervalli che incontriamo nei problemi reali, quindi il fattore dominante rimane solo l'enorme quantità di punti dati, i fattori n o m a cui siamo abituati.
(Puoi immaginare che la notazione Big-O nasconda un fattore costante che divide 32 o 64 bit per dato, lasciando solo il numero di punti dati ogni volta che ciascuno dei nostri numeri rientra in quel numero di bit o meno )
Ma prova a rielaborare con altri algoritmi per agire su set di dati che coinvolgono big int - numeri che richiedono più di 8 byte per essere rappresentati - e guarda cosa fa per il runtime. La grandezza dei numeri coinvolti fa sempre la differenza, anche in altri algoritmi come l'ordinamento binario, una volta che ci si espande oltre il buffer di sicurezza che i processori convenzionali ci danno "gratuitamente" gestendo batch da 4-8 byte.
Il trucco con l'algoritmo Knapsack di cui abbiamo discusso è che è insolitamente sensibile (rispetto ad altri algoritmi) all'ampiezza di un particolare parametro, W. Aggiungi un bit a W e raddoppi il tempo di esecuzione dell'algoritmo. Non abbiamo visto quel tipo di risposta drammatica ai cambiamenti di valore in altri algoritmi prima di questo, motivo per cui potrebbe sembrare che stiamo trattando Knapsack in modo diverso, ma questa è un'analisi genuina di come risponde in modo non polinomiale ai cambiamenti nella dimensione di input.