Número esperado de swaps na classificação de bolhas

14

Dada uma matriz de números inteiros, cada elemento da matriz pode ser aumentado por um número fixo com alguma probabilidade , . Eu tenho que encontrar o número esperado de swaps que ocorrerão para classificar a matriz usando a classificação por bolhas .N b p [ i ] 0 i < nANbp[i]0i<n

Eu tentei o seguinte:

  1. A probabilidade de um elemento para pode ser calculada facilmente a partir das probabilidades fornecidas.i < jA[i]>A[j]i<j

  2. Usando o exposto, calculei o número esperado de swaps como:

    double ans = 0.0;
    for ( int i = 0; i < N-1; i++ ){
        for ( int j = i+1; j < N; j++ ) {
            ans += get_prob(A[i], A[j]); // Computes the probability of A[i]>A[j] for i < j.
    

Basicamente, cheguei a essa idéia porque o número esperado de swaps pode ser calculado pelo número de inversões da matriz. Então, usando a probabilidade dada, estou calculando se um número será trocado por um número .A [ j ]A[i]A[j]

Observe que os elementos iniciais da matriz podem estar em qualquer ordem, classificados ou não. Então cada número pode mudar com alguma probabilidade. Depois disso, tenho que calcular o número esperado de swaps.

Eu postei uma pergunta semelhante antes, mas ela não tinha todas as restrições.

Não recebi boas dicas sobre se estou no caminho certo ou não, então listei todas as restrições aqui. Por favor, dê-me algumas dicas se estiver pensando no problema de maneira incorreta.

Comunidade
fonte
6
Tpyo bonito no título, no entanto.
21812 JeffE
Você não quer dizer, forneça uma matriz classificada de N inteiros, cada elemento ... Também o intervalo dos números na matriz inicial e as diferenças entre eles, em relação a b, parecem estar ausentes.
Danny Varod
Lembre-se de que, para esse tipo de análise, você precisa deixar bem claro qual "implementação" específica, se considerar a idéia do Bubblesort. Seria melhor se você desse o algoritmo em pseudo-código.
Raphael
Esse problema é causado por um concurso em andamento no site codechef codechef.com/JULY12/problems/LEBOBBLE. Ficarei feliz em publicar minha abordagem após o concurso.
Rizwanhudda

Respostas:

11

Vamos ser definido da seguinte maneira:BubbleSort

for (j = A.length; j > 1; j--)
    for (i = 0; i < j - 1; i++)
        if (A[i] > A[i + 1])
            swap(i, i + 1, A)

Dada alguma permutação , é dito que ocorreu uma inversão se para algunsVemos que executa uma verificação de inversão para cada par e, nesse caso, realiza uma troca. Seja o número de swaps. Não é difícil ver, no pior dos casos, possíveis trocas. Mas estamos interessados ​​no caso esperado, que podemos calcular definindo em termos de inversões em .x j < x i i < j . B u b b G e S o r t Xx1,,xnxj<xii<j.BubbleSortXX=(n2)XBubbleSort

Agora deixe onde é a variável indicadora de que existe uma inversão para algum par . A expectativa é definida como . Agora precisamos determinar .X=ji<jIijIij(i,j)E[X]=E[ji<jIij]=ji<jE[Iij]P{Iij}

Ao assumir qualquer permutação possível como entrada, cada uma com probabilidade uniforme, pode ser demonstrado que . O raciocínio por trás disso é que, sob qualquer permutação possível, metade do tempo e metade do tempo para .P{Iij}=12xj<xixi<xjij

Voltando ao nosso cálculo de expectativa, vemos queE[X]=ji<jE[Iij]=ji<j12=(n2)12=n(n1)4

Nicholas Mancuso
fonte