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:
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.
Jawaban:
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 nn n! 1 n
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)i nd d xi i maxi(max(1,i−xi))
Kemudian Anda melakukan perhitungan: untuk setiap temukan jumlah daftar dengan jarak maksimal khusus ini, maka nilai diharapkan adalah:d cd d
Dan itulah pemikiran dasar tanpa bagian tersulit yang menemukan . Mungkin ada solusi yang lebih sederhana.cd
EDIT: ditambahkan `diharapkan '
sumber
Ingatlah bahwa pasangan (resp. ) terbalik jika dan .(A[i],A[j]) (i,j) i<j A[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 .P R(P) P P=2,1,3,4 R(P)=4,3,1,2
Untuk setiap pasangan indeks ada inversi di salah satu atau .(i,j) P R(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(n−1)/2
sumber
Number of swaps <Jumlah iterations (baik dioptimalkan maupun skenario kasus gelembung sederhana)
Number of Inversions = Jumlah swap.
Oleh karena itu, Jumlah Iterasi>n(n−1)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)
sumber
dalam dokumen ini, kompleksitas waktu rata-rata sortir bubble mencapai O (nlog (n))! http://algo.inria.fr/flajolet/Publications/ViFl90.pdf
sumber