Avaliando a complexidade do tempo médio de um dado algoritmo de bolhas.


11

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 é:

i=0n(j=0n(i+1)O(1)+O(1))=O(n22+n2)=O(n2)

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.


6
você primeiro precisa definir o que significa a média. Como o algoritmo é determinístico, você teria que assumir algum tipo de distribuição pelas entradas.
Suresh

@ Sim Você pode mostrar como calculou a pior complexidade de tempo? Então, podemos ter uma idéia do que você quer dizer com complexidade média no seu caso.
0x0

Refiro-me ao tempo médio no tempo mais provável necessário (ou, em outras palavras, na versão matemática "pura" de: a média de todos os tempos observados na análise estatística). Por exemplo, quicksort tem uma média de nlogn, mesmo que o pior caso seja n ^ 2.
Sim

1
@Sim No caso da bolha caso tipo média = pior caso complexidade de tempo, o que significa que, caso a complexidade média tempo é também n2
0x0

3
Há uma diferença. o quicksort é calculado como "sobre a escolha dos lançamentos de moedas ao escolher um pivô", o que não tem nada a ver com os dados. Considerando que você está sugerindo que deseja calcular a média "de todas as entradas", o que pressupõe (por exemplo) que você espera que cada ordem da entrada ocorra com a mesma probabilidade. isso é razoável, mas deve ser declarado explicitamente.
Suresh

Respostas:


9

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.nn!1n

Sua complexidade média seria a soma do número de etapas de todas as listas divididas por .n!

(xEu)EunddxEuEumaxEu(max(1,Eu-xEu))

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 ddcdd

1n! d=0 0n dcd

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 '


Se você considera uma distribuição normal, existe uma maneira de aproximar o ? cd
Sim

Você pode dizerporque você pode misturar em qualquer lugar todas as permutações de [ , .., ] e acrescentar no final, mas isso é pequeno para provar em média. 2 d 1 n ²cd(n+1-d)(d-1)!2d1n²
Jmad

19

Lembre-se de que um par (resp. ) é invertido se e .( i , j ) i < j A [ i ] > A [ j ](UMA[Eu],UMA[j])(Eu,j)Eu<jUMA[Eu]>UMA[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 , 2PR(P)PP=2,1,3,4R(P)=4,3,1,2

Para cada par de índices há uma inversão em exatamente um de ou .P R ( P )(Eu,j)PR(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

n(n-1)4

isso avalia a quantidade de inversões. mas como sobre a quantidade de comparações que depende do tempo que o break-cláusula é interveio
Sim

Você obtém uma comparação por troca e, o mais importante, uma troca pode reduzir o número de inversões em no máximo uma.
Jmad

nem toda comparação resulta em uma troca, se a cláusula if for falsa, nenhuma inversão será feita.
Sim

@rgrig Se você fornecer um contra-exemplo, corrigirei minha resposta.
21712 Joe

@ Joe: eu removi meu comentário. Estava errado.
rgrig

2

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)


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.