¿Cuál es la complejidad de este algoritmo de conteo de bits?

La gente da buenas respuestas en términos de notación big-O. De hecho, es [math] O (arraySize \ cdot sizeOfInt) [/ math] y [math] O (arraySize) [/ math]. El tamaño de int en C ++ está garantizado en al menos 16 bits. En la práctica, son 32 bits en plataformas Intel de 32 o 64 bits.

Sin embargo, es mucho más difícil obtener una respuesta en términos de ciclos de CPU reales por dos razones. Primero, por http://en.wikipedia.org/wiki/Branch_predictor. Los procesadores superescalares modernos pueden realizar más de una operación por ciclo de CPU. Sin embargo, una predicción errónea de una sola rama puede costarle 10-15 ciclos de CPU desperdiciados. No es necesario decir que el rendimiento real de muchos algoritmos depende mucho de la tasa de predicción errónea de la rama.

Con suerte, el predictor de bifurcación del bucle externo debe proporcionar una suposición correcta (b / c la mayor parte del tiempo, vuelve al comienzo del bucle).

En segundo lugar, si sus enteros contienen solo unos pocos bits, el bucle interno terminará habitualmente antes en comparación con el caso de los enteros con muchos.

Deje [math] n = [/ math] el número de enteros.
Deje [math] m = [/ math] el número de bits en un entero.

Entonces la complejidad es [matemática] \ Theta (nm) [/ matemática]. Sin embargo, el número de bits en un entero es técnicamente constante ([matemática] 32 [/ matemática]), por lo que probablemente podría llamarlo un algoritmo [matemático] \ Theta (n) [/ matemático].

Es O (MN) en complejidad, mientras que M es el tamaño de matriz y N es el recuento de bits de cada elemento de matriz en promedio. Técnicamente, N nunca será mayor que 32, por lo que podríamos decir que la complejidad es O (M).

PD: Habrá un error de segmentación en su código si se proporciona un arraySize mayor que 100.

Es un algoritmo complejo O (n) ya que cada número entero tiene un tamaño de 32 bits y ejecutará un bucle de N números enteros (arraysize aquí)