Valutazione della complessità del tempo medio di un determinato algoritmo bolleort.


11

Considerando questo pseudo-codice di un bubblesort:

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

Quali sarebbero le idee di base che dovrei tenere a mente per valutare la complessità temporale media? Ho già compiuto il calcolo dei casi peggiori e migliori, ma sono bloccato a deliberare su come valutare la complessità media del ciclo interno, per formare l'equazione.

L'equazione del caso peggiore è:

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

in cui il sigma interno rappresenta il ciclo interno e il sigma esterno rappresenta il ciclo esterno. Penso che dovrei cambiare entrambi i sigmi a causa della clausola "if-then-break", che potrebbe influenzare il sigma esterno ma anche a causa della clausola if nel ciclo interno, che influenzerà le azioni eseguite durante un ciclo (4 azioni + 1 confronto se vero, altrimenti solo 1 confronto).

Per chiarimenti sul termine tempo medio: questo algoritmo di ordinamento richiederà tempi diversi su elenchi diversi (della stessa lunghezza), poiché l'algoritmo potrebbe richiedere più o meno passaggi attraverso / all'interno dei loop fino a quando l'elenco è completamente in ordine. Cerco di trovare un modo matematico (non statistico) per valutare la media di quei round necessari.

Per questo mi aspetto che qualsiasi ordine abbia la stessa possibilità.


6
devi prima definire cosa significa anche media. Poiché l'algoritmo è deterministico, dovresti assumere un qualche tipo di distribuzione sugli input.
Suresh,

@Sim Puoi mostrare come hai calcolato la complessità temporale peggiore? Quindi, potremmo avere un'idea di cosa intendi per complessità media nel tuo caso.
0x0,

Intendo il tempo medio nel modo di tempo più probabile necessario (o in altre parole la versione matematica "pura" di: la media di tutti i tempi osservati facendo un'analisi statistica). Ad esempio quicksort ha una media di nlogn anche se il suo caso peggiore è n ^ 2.
Sim

1
@Sim Nel caso di ordinamento a bolle caso medio = complessità nel caso peggiore, significato, caso medio La complessità temporale è anchen2
0x0

3
C'è una differenza quicksort è calcolato in media "sulla scelta dei lanci di monete quando si sceglie un perno" che non ha nulla a che fare con i dati. Considerando che si intende che si desidera eseguire la media "su tutti gli input", il che presuppone (ad esempio) che ci si aspetti che ogni ordinamento dell'input avvenga con la stessa probabilità. è ragionevole, ma dovrebbe essere dichiarato esplicitamente.
Suresh,

Risposte:


9

Per gli elenchi di lunghezza , media di solito significa che devi iniziare con una distribuzione uniforme su tuttipermutazioni di [ , .., ]: saranno tutte le liste che devi considerare.n ! 1 nnn!1n

La complessità media sarebbe quindi la somma del numero di passaggi per tutti gli elenchi divisi per.n!

n d d max i ( max ( 1 , i - x i ) )(xi)inddxiiomaxio(max(1,io-Xio))

Quindi fai i calcoli: per ogni trova il numero delle liste con questa particolare distanza massima, quindi il valore atteso di è:c d ddcdd

1n! Σd=0n dcd

E questi sono i pensieri di base senza la parte più difficile che sta trovando . Forse esiste una soluzione più semplice.cd

EDIT: aggiunto `previsto '


Se consideri una distribuzione normale, c'è un modo per approssimare ? cd
Sim

Puoi direperché puoi mescolare ovunque tutte le permutazioni di [ , .., ] e aggiungere alla fine, ma è piccolo per dimostrare in media. 2 d 1cd(n+1d)(d1)!2d1n²
jmad

19

Ricorda che una coppia (resp. ) viene invertita se e .( i , j ) i < j A [ i ] > A [ j ](UN[io],UN[j])(io,j)io<jUN[io]>UN[j]

Supponendo che l'algoritmo esegua uno swap per ogni inversione, il tempo di esecuzione dell'algoritmo dipenderà dal numero di inversioni.

Calcolare il numero previsto di inversioni in una permutazione casuale uniforme è facile:

Lasciare sia una permutazione, e sia sia l'inverso di . Ad esempio, se allora .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

Per ogni coppia di indici c'è un'inversione esattamente in uno di o .P R ( P )(io,j)PR(P)

Poiché il numero totale di coppie è e il numero totale e ciascuna coppia sono invertiti esattamente nella metà delle permutazioni, supponendo che tutte le permutazioni siano ugualmente probabili, il numero previsto di inversioni è:n(n-1)/2

n(n-1)4

questo valuta la quantità di inversioni. ma che dire della quantità di confronti che dipende dal momento in cui viene introdotta la clausola di break-
sim

Si ottiene un confronto per swap e, soprattutto, uno swap può ridurre al massimo il numero di inversioni.
jmad

non tutti i confronti si traducono in uno scambio, se la clausola if è falsa, non viene effettuata alcuna inversione.
Sim

@rgrig Se fornisci un contro-esempio, correggerò la mia risposta.
Joe

@Joe: ho rimosso il mio commento. Era sbagliato.
Rgrig

2

Numero di swap <Numero di iterazioni (sia in casi ottimizzati che semplici)

Numero di inversioni = Numero di swap.

Pertanto, Numero di iterazioni>n(n-1)4

Pertanto, la complessità media dei casi è . Ma poiché il caso medio non può superare il caso peggiore, si ottiene che è ,ω(n2)O(n2)

Questo ci dà: Average Time = θ(n2)

(Complessità temporale = numero di iterazioni n. Di iterazioni> n. Di swap)


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.