Mengapa Quicksort Acak memiliki biaya runtime terburuk (O log n)

18

Penyortiran Cepat Acak adalah perpanjangan dari Penyortiran Cepat di mana elemen pivot dipilih secara acak. Apa yang bisa menjadi kompleksitas waktu terburuk dari algoritma ini. Menurut saya, itu harus , sebagai kasus terburuk terjadi ketika poros dipilih secara acak dipilih dalam diurutkan atau membalikkan diurutkan order. Tetapi dalam beberapa teks [1] [2] kompleksitas waktu terburuknya ditulis sebagaiO(n2)O ( n log n )O(nlogn)

Apa yang benar

Atinesh
sumber
3
Anda harus ini "beberapa teks" yang sedang Anda bicarakan. Ada sesuatu yang disembunyikan di sana. Anda akan menemukannya jika membaca lagi "teks" ini
AJed
Catatan: Tautan [1] sudah mati. Tautan [2] dengan jelas menyatakan bahwa algoritma tersebut diacak, jadi untuk setiap input yang Anda tidak memiliki "runtime", tetapi "runtime yang diharapkan". Dan runtime yang diharapkan untuk input terburuk adalah O (n log n).
gnasher729

Jawaban:

18

Kedua sumber Anda merujuk ke "waktu berjalan terburuk yang diharapkan" dariSaya menduga ini mengacu pada persyaratan waktu yang diharapkan, yang berbeda dari kasus terburuk absolut.O(nlogn).

Quicksort biasanya memiliki persyaratan mutlak waktu terburuk untuk . Kasus terburuk terjadi ketika, pada setiap langkah, prosedur partisi membagi array length menjadi array ukuran dan . Pemilihan elemen pivot "sial" ini membutuhkan panggilan rekursif, yang mengarah ke kasus terburuk .n 1 n - 1 O ( n ) O ( n 2 )O(n2)n1n1O(n)O(n2)

Memilih pivot secara acak atau acak mengocok array sebelum penyortiran memiliki efek rendering kasus terburuk sangat tidak mungkin, terutama untuk array besar. Lihat Wikipedia untuk bukti bahwa persyaratan waktu yang diharapkan adalah . Menurut sumber lain , "probabilitas quicksort akan menggunakan jumlah kuadrat perbandingan ketika menyortir array besar di komputer Anda jauh lebih kecil daripada probabilitas bahwa komputer Anda akan terkena petir."O(nlogn)

Edit:

Per komentar Bangye, Anda dapat menghilangkan urutan pemilihan pivot kasus terburuk dengan selalu memilih elemen median sebagai pivot. Karena menemukan median membutuhkan waktu, ini memberikan kinerja kasus terburuk. Namun, karena quicksort acak sangat tidak mungkin untuk menemukan kasus terburuk, varian penentu median quicksort jarang digunakan.Θ ( n log n )O(n)Θ(nlogn)

James Evans
sumber
Jadi secara umum kita dapat mengatakan itu berperilaku kuadrat dalam kasus terburuk
Atinesh
@Atinesh Tidak, setidaknya jika Anda maksud maksudnya . Θ
Raphael
Saya pikir itu benar untuk mengatakan kinerja terburuk quicksort acak adalah O(n2).
James Evans
4
Quicksort dapat mengambil hanya waktu dalam kasus terburuk jika seseorang menggunakan algoritma linear-waktu untuk menemukan median sebagai pivot. Tentu saja, quicksort acak memiliki kinerja praktis yang lebih baik biasanya. Θ(ncatatann)
Bangye
6

Anda melewatkan teks-teks ini yang berbicara tentang " run time expected case terburuk ", bukan "runtime kasus terburuk".

Mereka sedang mendiskusikan implementasi Quicksort yang melibatkan elemen acak. Biasanya Anda memiliki algoritma deterministik, yaitu algoritma yang untuk input yang diberikan akan selalu menghasilkan langkah yang sama persis. Untuk menentukan "runtime kasus terburuk", Anda memeriksa semua input yang mungkin, dan memilih salah satu yang menghasilkan runtime terburuk.

Tetapi di sini kita memiliki faktor acak. Diberikan beberapa input, algoritma tidak akan selalu melakukan langkah yang sama karena beberapa keacakan terlibat. Alih-alih memiliki runtime untuk setiap input tetap, kami memiliki "runtime yang diharapkan" - kami memeriksa setiap nilai yang mungkin dari keputusan acak dan probabilitasnya, dan "runtime yang diharapkan" adalah rata-rata tertimbang dari runtime untuk setiap kombinasi keputusan acak , tetapi masih untuk input tetap.

Jadi kami menghitung "runtime yang diharapkan" untuk setiap input yang mungkin, dan untuk mendapatkan "runtime yang diharapkan terburuk", kami menemukan satu input yang mungkin di mana runtime yang diharapkan adalah yang terburuk. Dan ternyata mereka menunjukkan bahwa kasus terburuk untuk "runtime yang diharapkan" hanyalah O (n log n). Saya tidak akan terkejut jika hanya mengambil pivot pertama secara acak akan mengubah kasus terburuk yang diharapkan runtime menjadi o (n ^ 2) (sedikit o alih-alih Big O), karena hanya beberapa dari n pivot akan mengarah ke kasus terburuk tingkah laku.

gnasher729
sumber
2

Perhatikan bahwa ada dua hal yang perlu dilakukan ekspektasi / rata-rata: permutasi input dan pivot (satu per partisi).

nΘ(ncatatann)

Θ(ncatatann)

Intinya, periksa sumber Anda untuk implementasi yang mereka gunakan dan jumlah yang mereka anggap resp acak. diperbaiki dalam analisis mereka.

Raphael
sumber
Pertimbangkan pertanyaan ini postimg.org/image/fiurc4z87 yang telah saya tanyakan dalam ujian. Menurut saya, ans yang sesuai menurut saya (c)
Atinesh
1
@ Atinesh Saya pikir jawaban saya memberi Anda cukup informasi tentang ini.
Raphael
-1

O(n2)

Kasus terburuk untuk quicksort acak adalah elemen yang sama dengan input. Mis: 2,2,2,2,2,2

T(n)=T(n1)+nO(n2)

pratyay
sumber
Itu jika Anda memiliki implementasi quicksort yang sangat membosankan. Setiap implementasi yang layak akan di pertukaran partisi pertama # 1 dan # 6, # 2 dan # 5, # 3 dan # 4, dan kemudian akan mengurutkan dua sub-panjang panjang 3.
gnasher729
Saya kira Anda memiliki <= juga> = pada kedua pointer yang memindai dari LHS dan RHS. Itu sebabnya Anda mengatakan demikian. '=' dikaitkan dengan salah satu pointer, bukan keduanya. Dalam hal itu pohon rekursi tumbuh sampai n.
pratyay
Dan itulah yang saya sebut implementasi yang sangat gila. Setiap implementasi yang membutuhkan runtime kuadratik untuk kasus "semua elemen adalah sama" adalah tindakan kriminal yang bodoh. Sebenarnya ada implementasi yang mengambil waktu linier dalam kasus ini (O (n), bukan O (n log n)).
gnasher729