Considerando este pseudocódigo de un bubbleort:
FOR i := 0 TO arraylength(list) STEP 1
switched := false
FOR j := 0 TO arraylength(list)-(i+1) STEP 1
IF list[j] > list[j + 1] THEN
switch(list,j,j+1)
switched := true
ENDIF
NEXT
IF switched = false THEN
break
ENDIF
NEXT
¿Cuáles serían las ideas básicas que tendría que tener en cuenta para evaluar la complejidad temporal promedio? Ya logré calcular el peor y el mejor de los casos, pero estoy atascado deliberando cómo evaluar la complejidad promedio del ciclo interno, para formar la ecuación.
La peor ecuación del caso es:
en el que el sigma interno representa el bucle interno, y el sigma externo representa el bucle externo. Creo que necesito cambiar ambas sigmas debido a la cláusula "if-then-break", que podría afectar la sigma externa pero también debido a la cláusula if en el bucle interno, que afectará las acciones realizadas durante un bucle (4 acciones + 1 comparación si es verdadera, de lo contrario solo 1 comparación).
Para aclarar el término tiempo promedio: este algoritmo de clasificación necesitará un tiempo diferente en diferentes listas (de la misma longitud), ya que el algoritmo podría necesitar más o menos pasos a través / dentro de los bucles hasta que la lista esté completamente en orden. Trato de encontrar una forma matemática (no estadística) de evaluar el promedio de esas rondas necesarias.
Para esto espero que cualquier orden sea de la misma posibilidad.
Respuestas:
Para las listas de longitud , el promedio generalmente significa que debe comenzar con una distribución uniforme en todas las n . permutaciones de [ 1 , .., n ]: esas serán todas las listas que debe tener en cuenta.n n! 1 n
¡Su complejidad promedio sería la suma del número de pasos para todas las listas divididas por .n!
Luego haces los cálculos: para cada encuentra el número de listas con esta distancia máxima particular, entonces el valor esperado de es:c d dd cd d
Y esos son los pensamientos básicos sin la parte más difícil que es encontrar . Quizás haya una solución más simple.cd
EDITAR: agregado `esperado '
fuente
Recuerde que un par (resp. ) se invierte si y .(A[i],A[j]) (i,j) i<j A[i]>A[j]
Suponiendo que su algoritmo realice un intercambio por cada inversión, el tiempo de ejecución de su algoritmo dependerá de la cantidad de inversiones.
Calcular el número esperado de inversiones en una permutación aleatoria uniforme es fácil:
Deje que sea una permutación, y dejar que sea el inverso de . Por ejemplo, si entonces .P R(P) P P=2,1,3,4 R(P)=4,3,1,2
Para cada par de índices hay una inversión en exactamente uno de o .(i,j) P R(P)
Como el número total de pares es , y el número total y cada par se invierte exactamente en la mitad de las permutaciones, suponiendo que todas las permutaciones sean igualmente probables, el número esperado de inversiones es:n(n−1)/2
fuente
Número de intercambios <Número de iteraciones (tanto en el caso de burbuja optimizado como en el simple)
Número de inversiones = Número de intercambios.
Por lo tanto, Número de iteraciones>n(n−1)4
Por lo tanto, la complejidad del caso promedio es . Pero, dado que el caso promedio no puede exceder el peor de los casos, obtenemos que es ,ω(n2) O(n2)
Esto nos da: Tiempo promedio =θ(n2)
(Complejidad de tiempo = Número de iteraciones no. De iteraciones> no. De swaps)
fuente
en este documento, la complejidad del tiempo promedio de clasificación de burbujas alcanzó O (nlog (n))! http://algo.inria.fr/flajolet/Publications/ViFl90.pdf
fuente