Respuestas:
Cuando hacemos cálculos de complejidad, generalmente usamos el modelo RAM . En este modelo suponemos que la indexación de matriz es O (1). La declaración de asignación es como asignar un valor a algunas variables en una matriz de variables . Esto es solo por conveniencia. Simplifica el análisis del algoritmo. En el mundo real, la indexación de conjuntos requiere O (log I) donde I es el número de cosas indexadas.
Generalmente consideramos cosas que dependen del tamaño de la entrada, por ejemplo, bucles. Incluso si hay una operación O (1) en el ciclo y se ejecuta n veces, el algoritmo se ejecuta durante el tiempo O (n).
Pero la operación O (1) fuera del ciclo toma solo tiempo constante y O (n) + O (1) = O (n).
Lea sobre el algoritmo de clasificación de radix de CLRS.
El objetivo final es el "tiempo de ejecución en segundos" o más generalmente (sin tener en cuenta las características modernas de la CPU) "número de ciclos de reloj". Como resultado, esto es difícil de analizar, y también es específico de la máquina o al menos del conjunto de instrucciones. Por lo tanto, generalmente no se hace.
El siguiente nivel de abstracción es contar con precisión todas las operaciones (de algunos pseudocódigos de estilo ensamblador), manteniendo el costo de operación individual (en ciclos de reloj) como parámetros. Tenga en cuenta que dicho análisis se encuentra en "El arte de la programación de computadoras" de Knuth, entre otros, por lo que ciertamente hay un lugar para este tipo de enfoque, a pesar de que es difícil y tiende a ser más difícil en presencia de jerarquía de memoria.
Por último, pero no menos importante, y sin duda el más destacado, es el análisis de las operaciones dominantes que ignoran factores constantes y desaparecen asintóticamente (" análisis"). El razonamiento es que el tiempo de ejecución se comportará asintóticamente como el número de operaciones ejecutadas con mayor frecuencia, multiplicado por algún factor dependiendo de la implementación real y la máquina. Este tipo de análisis arroja resultados generales que se aplican a todas las máquinas (cubiertos por el modelo RAM) y es más fácil de realizar que los anteriores. Sin embargo, puede carecer de especificidad.
Dejando atrás los marcos "clásicos", muchos algoritmos están dominados por el costo de memoria y / o comunicación, por lo que en ese caso se cuenta el número y el volumen de accesos de memoria resp. Las transmisiones de red son razonables (y tal vez suficientes).
Además, tenga en cuenta que a menudo no estamos tan interesados en el rendimiento absoluto de un algoritmo sino en compararlo con otros. Esto también puede informar la elección del parámetro analizado.
Como puede ver, no hay una respuesta definitiva. Dependiendo de los objetivos del análisis en cuestión, se pueden dar diferentes respuestas.
Vea también mi respuesta aquí para algunos pensamientos relacionados, y la respuesta de Sebastian en Quicksort para un ejemplo.