Ciò che funziona per me è conoscere un po 'di teoria dell'informazione.
Nello specifico, quando un programma esegue un'istruzione IF come questa:
if (test){
... code A ...
} else {
... code B ...
}
test
ha una certa probabilità P di essere true
, e 1-P di essere false
, e le informazioni acquisite (nel contatore del programma) quando si effettua quel ramo è I = log (1 / P) (base 2).
Se P è 0.5 (è altrettanto probabile che sia vero come falso), allora I = log (2) = 1 non importa quale ramo è preso. Questa è la quantità che il contatore del programma "impara" nel fare questa scelta.
Ora Entropy (parola spaventosa, lo so) è solo informazione media acquisita su tutti i rami, che è 1, giusto?
Quindi potresti dire che il ramo fa 1 bit di lavoro quando viene eseguito.
Supponiamo che P non sia 0,5. Supponiamo che tu stia facendo una ricerca lineare in una tabella di 1024 voci. Il primo test che fai dice "La voce 0 è quella che sto cercando?".
Se la risposta potrebbe essere ovunque, allora P = 1/1024 e 1-P = 1023/1024.
Quindi se l'elemento che stai cercando è il primo, ottieni log (1024) = dieci bit , ma se non lo è, ottieni solo il log (1024 / 1023) o essenzialmente zero bit .
Qual è l'entropia?
È la somma delle informazioni che ottieni su ciascun ramo moltiplicato per la probabilità di quel ramo.
È 1/1024 * 10 + 1023/1024 * 0, che è circa 1 / 102,4.
Quel test "impara" meno di un centesimo di bit in media.
Poiché per trovare un elemento in una tabella di immissione 1024, devi imparare 10 bit, puoi vedere perché la ricerca lineare è lenta.
Infatti, se N è il numero di bit che devi imparare, è esponenziale!
Ecco perché le ricerche basate su punti decisionali binari altrettanto probabili sono O (logN).
Un modo per fare una ricerca più veloce è indexing . Ecco dove hai un indice e usalo per localizzare un elemento di un array.
Se la matrice è lunga 1024 elementi, è come un punto di decisione con 1024 risultati.
Se sono tutti ugualmente probabili, qual è l'entropia?
È 1/1024 * log (1024) + 1/1024 * log (1024) ... per 1024 termini, che esce a - dieci bit .
Impari tutti e dieci i bit in una singola operazione!
OK, che ne dici di ordinare?
Se hai N elementi, devi cercare dove ognuno appartiene all'array, quindi costa sostanzialmente N volte il costo della ricerca.
Non potrebbe essere più semplice.