Mengevaluasi kompleksitas waktu rata-rata dari algoritme bubbleort yang diberikan.

11

Mempertimbangkan pseudo-code dari bubblesort ini:

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

Apa ide dasar yang harus saya ingat untuk mengevaluasi kompleksitas waktu rata-rata? Saya sudah berhasil menghitung kasus-kasus terburuk dan terbaik, tetapi saya terjebak membahas bagaimana mengevaluasi kompleksitas rata-rata lingkaran dalam, untuk membentuk persamaan.

Persamaan kasus terburuk adalah:

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

di mana sigma dalam mewakili loop dalam, dan sigma luar mewakili loop luar. Saya berpikir bahwa saya perlu mengubah kedua sigma karena klausa "jika-kemudian-pecah", yang mungkin mempengaruhi sigma luar tetapi juga karena klausa if-dalam loop batin, yang akan mempengaruhi tindakan yang dilakukan selama loop (Perbandingan 4 tindakan + 1 jika benar, atau hanya 1 perbandingan).

Untuk klarifikasi pada istilah rata-rata waktu: Algoritma pengurutan ini akan membutuhkan waktu yang berbeda pada daftar yang berbeda (dengan panjang yang sama), karena algoritma ini mungkin memerlukan langkah-langkah lebih kurang melalui / di dalam loop sampai daftar benar-benar dalam urutan. Saya mencoba untuk menemukan matematika (cara non statistik) untuk mengevaluasi rata-rata putaran yang dibutuhkan.

Untuk ini saya berharap urutan apapun dari kemungkinan yang sama.

Sim
sumber
6
pertama-tama Anda perlu mendefinisikan apa yang rata-rata berarti. Karena algoritme bersifat deterministik, Anda harus mengasumsikan semacam distribusi melalui input.
Suresh
@Sim Dapatkah Anda menunjukkan bagaimana Anda menghitung kompleksitas waktu terburuk? Kemudian, kami mungkin mendapatkan ide tentang apa yang Anda maksud dengan kompleksitas rata-rata dalam kasus Anda.
0x0
Maksud saya rata-rata waktu dalam cara waktu yang paling mungkin dibutuhkan (atau dengan kata lain versi matematika 'murni' dari: rata-rata dari semua waktu yang diamati melakukan analisis statistik). Misalnya quicksort memang memiliki rata-rata nlogn meskipun kasus terburuknya adalah n ^ 2.
Sim
1
@Sim Dalam kasus bubble sort average case = kompleksitas waktu terburuk, artinya, Rata-rata kompleksitas waktu jugan2
0x0
3
Ada perbedaan. quicksort dirata-rata "atas pilihan lemparan koin ketika memilih pivot" yang tidak ada hubungannya dengan data. Sedangkan Anda menyiratkan bahwa Anda ingin rata-rata "atas semua input" yang mengasumsikan (misalnya) bahwa Anda mengharapkan setiap pemesanan input terjadi dengan probabilitas yang sama. itu masuk akal, tetapi harus dinyatakan secara eksplisit.
Suresh

Jawaban:

9

Untuk daftar panjang , rata-rata biasanya berarti Anda harus mulai dengan distribusi yang seragam pada semuapermutasi [ , .., ]: itu akan menjadi semua daftar yang harus Anda pertimbangkan.n ! 1 nnn!1n

Kompleksitas rata-rata Anda kemudian akan menjadi jumlah dari jumlah langkah untuk semua daftar dibagi dengan.n!

Untuk daftar yang diberikan , jumlah langkah algoritma Anda adalah mana adalah jarak terbesar antara elemen dan lokasi yang seharusnya (tetapi hanya jika harus pindah ke kiri), yaitu .(xi)inddxiimaxi(max(1,ixi))

Kemudian Anda melakukan perhitungan: untuk setiap temukan jumlah daftar dengan jarak maksimal khusus ini, maka nilai diharapkan adalah:dcdd

1n! d=0n dcd

Dan itulah pemikiran dasar tanpa bagian tersulit yang menemukan . Mungkin ada solusi yang lebih sederhana.cd

EDIT: ditambahkan `diharapkan '

jmad
sumber
Jika Anda mempertimbangkan distribusi normal, apakah ada cara untuk memperkirakan ? cd
Sim
Anda dapat mengatakankarena Anda dapat bergaul di mana saja semua permutasi [ , .., ] dan menambahkan di akhir tetapi itu kecil untuk membuktikan rata-rata . cd(n+1d)(d1)!2d1n²
jmad
19

Ingatlah bahwa pasangan (resp. ) terbalik jika dan .(A[i],A[j])(i,j)i<jA[i]>A[j]

Dengan asumsi algoritma Anda melakukan satu swap untuk setiap inversi, waktu berjalan algoritma Anda akan tergantung pada jumlah inversi.

Menghitung jumlah inversi yang diharapkan dalam permutasi acak yang seragam itu mudah:

Biarkan menjadi permutasi, dan biarkan menjadi kebalikan dari . Misalnya, jika maka .PR(P)PP=2,1,3,4R(P)=4,3,1,2

Untuk setiap pasangan indeks ada inversi di salah satu atau .(i,j)PR(P)

Karena jumlah total pasangan adalah , dan jumlah total dan masing-masing pasangan terbalik tepat setengah dari permutasi, dengan asumsi semua permutasi sama-sama kemungkinan, jumlah inversi yang diharapkan adalah:n(n1)/2

n(n1)4
Joe
sumber
ini mengevaluasi jumlah inversi. tetapi bagaimana dengan jumlah perbandingan yang tergantung pada waktu break-clause dimasukkan
Sim
Anda mendapatkan satu perbandingan dengan swap dan yang paling penting satu swap dapat mengurangi jumlah inversi paling banyak satu.
jmad
tidak setiap perbandingan menghasilkan swap, jika klausa if salah, tidak ada inversi yang dilakukan.
Sim
@ rgrig Jika Anda memberikan contoh tandingan, maka saya akan memperbaiki jawaban saya.
Joe
@ Jo: Saya menghapus komentar saya. Itu salah.
rgrig
2

Number of swaps <Jumlah iterations (baik dioptimalkan maupun skenario kasus gelembung sederhana)

Number of Inversions = Jumlah swap.

Oleh karena itu, Jumlah Iterasi>n(n1)4

Dengan demikian, kompleksitas kasus rata-rata adalah . Tapi, karena kasus rata-rata tidak bisa melebihi kasus terburuk, kami mendapatkan bahwa itu adalah ,ω(n2)O(n2)

Ini memberi kita: Waktu Rata-Rata = θ(n2)

(Kompleksitas waktu = Jumlah iterasi no. Iterasi> no. Swap)

kushj
sumber
0

dalam dokumen ini, kompleksitas waktu rata-rata sortir bubble mencapai O (nlog (n))! http://algo.inria.fr/flajolet/Publications/ViFl90.pdf

pengguna84630
sumber
1
Itu tidak benar. Mereka membuktikan hasil dari Knuth yang menunjukkan bahwa jumlah perbandingan yang diharapkan kira-kira . n2/2
Yuval Filmus