Non sono nemmeno uno studente CS, quindi questa potrebbe essere una domanda stupida, ma per favore abbi pazienza con me ...
Nell'era pre-computer, possiamo implementare solo una struttura di dati array con qualcosa come una matrice di cassetti. Poiché è necessario individuare il cassetto con l'indice corrispondente prima di estrarre il valore da esso, la complessità temporale della ricerca di array è , presupponendo una ricerca binaria.
Tuttavia, l'invenzione dei computer ha fatto una grande differenza. I computer moderni possono leggere dalla loro RAM così velocemente che ora consideriamo la complessità temporale della ricerca di array come (anche tecnicamente non è il caso, perché ci vuole più tempo per spostare il registro su una distanza maggiore, ecc.)
Un altro esempio sono i dizionari Python. Mentre si potrebbe ottenere una complessità di accesso al dizionario di con un metodo magico sovraccarico scritto male (o ridicolmente sfortuna, cioè chiavi che hanno molte collisioni di hash), di solito si presume che sia . In questo caso, la complessità temporale dipende sia dall'implementazione della tabella hash dei dizionari Python, sia dall'implementazione delle chiavi delle funzioni hash.O ( 1 )__hash__
Ciò implica che l'hardware / l'implementazione possono influire sulla complessità temporale degli algoritmi? (Mentre entrambi gli esempi riguardano strutture di dati anziché algoritmi, i secondi sono basati sul primo e non ho mai sentito parlare della complessità temporale delle strutture di dati, quindi sto usando il termine "algoritmi" qui)
Per me, gli algoritmi sono astratti e concettuali, le cui proprietà come la complessità tempo / spazio non dovrebbero essere influenzate dal fatto che siano implementate in un modo specifico, ma lo sono?