Numero previsto di swap nell'ordinamento a bolle


14

Dato un array A di N numeri interi, ogni elemento dell'array può essere aumentato di un numero fisso b con una certa probabilità p[i] , 0i<n . Devo trovare il numero previsto di swap che avranno luogo per ordinare l'array usando il bubble sort .

Ho provato quanto segue:

  1. La probabilità per un elemento A[i]>A[j] per i<j può essere calcolata facilmente dalle probabilità date.

  2. Utilizzando quanto sopra, ho calcolato il numero previsto di swap come:

    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.
    

Fondamentalmente sono arrivato a questa idea perché il numero previsto di swap può essere calcolato dal numero di inversioni dell'array. Quindi, usando la probabilità data, sto calcolando se un numero A[i] verrà scambiato con un numero A[j] .

Si noti che gli elementi dell'array iniziale possono essere in qualsiasi ordine, ordinati o non ordinati. Quindi ogni numero può cambiare con una certa probabilità. Dopo questo devo calcolare il numero previsto di swap.

Ho pubblicato una domanda simile prima ma non aveva tutti i vincoli.

Non ho avuto buoni suggerimenti sul fatto che io sia sulla strada giusta o meno, quindi ho elencato tutti i vincoli qui. Per favore, mi dia qualche suggerimento se sto pensando al problema in modo errato.


6
Carino tpyo nel titolo, però.
JeffE,

Non vuoi dire, dai un array ordinato di N numeri interi, ogni elemento ... Anche l'intervallo dei numeri nell'array iniziale e le differenze tra loro, rispetto a b sembrano mancare.
Danny Varod,

Tieni presente che per questo tipo di analisi, devi chiarire quale particolare "implementazione" se hai preso in considerazione l'idea di Bubblesort. Sarebbe meglio se fornissi l'algoritmo in pseudo codice.
Raffaello

Questo problema proviene da un concorso in corso sul sito codechef codechef.com/JULY12/problems/LEBOBBLE Sarò felice di pubblicare il mio approccio dopo il concorso.
Rizwanhudda,

Risposte:


11

Sia definito come segue: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)

Data una certa permutazione , si dice che si è verificata un'inversione se x j < x i per alcuni i < j . Vediamo che B u b b l e S o r t esegue un controllo di inversione per ogni coppia, e se così, esegue uno scambio. Sia X il numero di swap. Non è difficile vedere nel peggiore dei casi ci sono X = ( nx1,,xnxj<xii<j.BubbleSortX possibili swap effettuati. Ma ci interessa nel caso previsto che possiamo calcolare definendoXin termini di inversioniBubbleSoRt.X=(n2)XBubbleSort

Ora lasciate dove sono i j è la variabile indicatore che esiste un'inversione per qualche coppia ( i , j ) . L'aspettativa è definita come E [ X ] = E [ j i < j I i j ] = j i < j E [ I i j ]X=ji<jIijIij(i,j)E[X]=E[ji<jIij]=ji<jE[Iij]. Ora dobbiamo determinare .P{Iij}

Quando si assume qualsiasi possibile permutazione come input, ciascuno con probabilità uniforme, si può dimostrare che . Il ragionamento alla base di ciò è che sotto ogni possibile permutazione, metà del tempoxj<xie metà del tempoxi<xjperij.P{Iij}=12xj<xixi<xjij

Tornando al nostro calcolo delle aspettative, vediamo che E[X]=ji<jE[Iij]=ji<j12=(n2)12=n(n1)4

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.