Considerando esse pseudo-código de um conjunto de bolhas:
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
Quais seriam as idéias básicas que eu teria em mente para avaliar a complexidade média de tempo? Já concluí o cálculo dos piores e melhores casos, mas estou decidido a avaliar como a complexidade média do loop interno, para formar a equação.
A pior equação de caso é:
em que o sigma interno representa o loop interno e o sigma externo representa o loop externo. Eu acho que preciso alterar os dois sigmas devido à cláusula "se-então-quebrar", que pode afetar o sigma externo, mas também devido à cláusula se no loop interno, que afetará as ações realizadas durante um loop (4 ações + 1 comparação, se verdadeira, ou apenas 1 comparação).
Para esclarecimentos sobre o termo tempo médio: esse algoritmo de classificação precisará de um tempo diferente em listas diferentes (do mesmo tamanho), pois o algoritmo pode precisar de mais ou menos etapas através dos / dentro dos loops até que a lista esteja completamente em ordem. Tento encontrar uma maneira matemática (não estatística) de avaliar a média das rodadas necessárias.
Por isso, espero que qualquer ordem tenha a mesma possibilidade.
Respostas:
Para listas de comprimento , a média geralmente significa que você precisa começar com uma distribuição uniforme em todos os n ! permutações de [ 1 , .., n ]: serão todas as listas que você deve considerar.n n ! 1 n
Sua complexidade média seria a soma do número de etapas de todas as listas divididas por .n !
Depois, faça as contas: para cada encontre o número de listas com essa distância máxima específica, então o valor esperado de é:c d dd cd d
E esses são os pensamentos básicos, sem a parte mais difícil, que é encontrar . Talvez exista uma solução mais simples.cd
EDIT: adicionado `esperado '
fonte
Lembre-se de que um par (resp. ) é invertido se e .( i , j ) i < j A [ i ] > A [ j ]( A [ i ] , A [ j ] ) ( i , j ) eu < j A [ i ] > A [ j ]
Supondo que seu algoritmo execute uma troca para cada inversão, o tempo de execução do seu algoritmo dependerá do número de inversões.
Calcular o número esperado de inversões em uma permutação aleatória uniforme é fácil:
Vamos ser uma permutação, e deixá- ser o inverso de . Por exemplo, se então .R ( P ) P P = 2 , 1 , 3 , 4 R ( P ) = 4 , 3 , 1 , 2P R ( P) P P= 2 , 1 , 3 , 4 R ( P) = 4 , 3 , 1 , 2
Para cada par de índices há uma inversão em exatamente um de ou .P R ( P )( i , j ) P R ( P)
Como o número total de pares é e o número total e cada par é invertido exatamente na metade das permutações, assumindo que todas as permutações sejam igualmente prováveis, o número esperado de inversões é:n ( n - 1 ) / 2
fonte
Número de trocas <Número de iterações (no cenário otimizado e simples de caixa de bolhas)
Número de Inversões = Número de swaps.
Portanto, Número de iterações>n ( n - 1 )4
Portanto, a complexidade média dos casos é . Mas, como o caso médio não pode exceder o pior caso, obtemos que é ,ω ( n2) O ( n2)
Isso nos dá: Tempo médio =θ ( n2)
(Complexidade temporal = Número de iterações de iterações> número de swaps)
fonte
neste documento, a complexidade do tempo médio da classificação de bolhas atingiu O (nlog (n))! http://algo.inria.fr/flajolet/Publications/ViFl90.pdf
fonte