Pregunta: ¿Cuál es la forma "correcta" de interpretar el algoritmo que se describe a continuación?
Quería comprobar si mi comprensión del siguiente algoritmo es correcta, ya que no he "encontrado" este escenario en el que el bucle for interno, creo, se ve afectado por el valor de siendo constantemente reducido a la mitad. Si ayuda, los índices van de 1 a , y la entrada es una matriz de enteros, y un tamaño .
function F(A[.],n)
s <- 0
m <- n
while m > 0
for i <- 1 to m do
s <- s + A[i]
m <- m/2
Tengo entendido que miramos primero el ciclo más interno, que es el ciclo for. Por lo tanto, está en complejidad, ya que itera hasta . Mirando fuera de este ciclo, está el ciclo while, que comienza en pero constantemente se redujo a la mitad, lo que significa que está en complejidad. Por lo tanto, la complejidad general es .
Sin embargo, lo que me "hace tropezar" es porque se está reduciendo a la mitad, eso estaría afectando el bucle for interno, lo que significaría que atraviesa la matriz "la mitad" del tiempo, por lo tanto, sería complejidad. Como antes, el ciclo while externo es , por lo tanto, la complejidad general es .
¿Cómo debo "analizar" este algoritmo, ya que siento que las dos respuestas son "viables" pero la de abajo tiene más "sentido".
PISTA
Su complejidad resumida es (asumiendo )
¿Puedes sumar la serie geométrica y convertir el resultado en ?
ACTUALIZAR
Para responder a su pregunta en los comentarios, cada iteración del bucle for interno consta de 3 operaciones: A[i]
búsqueda de valor s += A[i]
e i += 1
(incremento de índice de bucle). Supongo +=
que es atómico, es decir, cuenta como una operación, si en realidad está implementando la asignación y la suma por separado, serán 2 operaciones cada una, por lo tanto, 5 operaciones en total.
Finalmente, se necesita una iteración del ciclo externo m /= 2
con el check m > 0
, que también asumo que es atómico. De lo contrario, necesitaría 3 operaciones aquí, y todo el ciclo sería
en cambio.
usuario660015
gt6989b