Asumsikan kita ingin mengurutkan daftar dari bilangan real. Anggaplah kita diberi kotak hitam yang dapat mengurutkan bilangan real secara instan. Berapa banyak keuntungan yang bisa kita peroleh dengan menggunakan kotak hitam ini?n √
Misalnya, dapatkah kita mengurutkan angka hanya dengan panggilan ke kotak hitam? Algoritma terbaik yang saya temukan menggunakan panggilan ke kotak hitam. Tapi saya belum bisa memperbaikinya lebih lanjut. Berikut ini adalah algoritma saya yang mirip dengan merge-sort:n
Pertama mempartisi daftar menjadi daftar dengan ukuran kira-kira . Kemudian gunakan panggilan ke kotak hitam untuk mengurutkan daftar ini. Akhirnya, gabungkan daftar yang diurutkan menggunakan kotak hitam sebagai berikut:√ s1,s2,. . . ,s √ √ √
Letakkan elemen terkecil dari daftar di daftar baru , lalu panggil kotak hitam untuk mengurutkannya. Jumlah di (pertama dan elemen terkecil ) akan menjadi nomor terkecil di . Kita bisa meletakkannya di tempat pertama dari daftar keluaran.
Dengan asumsi elemen telah dipilih dari , kita ganti dengan elemen terkecil kedua daftar semacam , dan lagi menjalankan kotak hitam di atasnya untuk menghitung anggota terkecil kedua .
Kami melanjutkan sampai semua elemen diurutkan. Jumlah total panggilan kotak hitam untuk bagian ini adalahL [ 1 ] L S s j L [ 1 ] s j S n - √
. Oleh karena itu secara keseluruhan jumlah total panggilan akan .
Di sisi lain, sepertinya kita harus dapat memperoleh batas bawah menggunakan batas bawah pada perbandingan jumlah yang diperlukan untuk menyortir sebagai berikut: Kita dapat menerapkan kotak hitam menggunakan perbandingan. Jika kita dapat menyelesaikan masalah dengan panggilan ke kotak hitam dan menggabungkan waktu linear, kita dapat mengurutkan bilangan real dengan perbandingan yang tidak mungkin.o( √no(nlgn)
Saya kira kita dapat membuktikan bahwa adalah batas bawah untuk jumlah panggilan ke kotak hitam, karena banyak perbandingan yang digunakan dalam kotak hitam akan dibagikan dan karenanya diceritakan dalam argumen kami.
UPDATE: Seperti yang disarankan oleh posting lain, sebuah juga dapat dicapai.
sumber
Jawaban:
Dimungkinkan untuk menyortir dengan panggilan ke kotak hitam dan tidak ada perbandingan.O ( n--√logn )
Pertama, pertimbangkan masalah pembagian berimbang berikut: diberikan elemen A [ 1 .. m ] (di mana √m A [ 1 .. m ] ), bagi mereka menjadi dua kelompok, ukuran terkecil setidaknya sekitarm/4, sehingga semua elemen dalam kelompok pertama lebih kecil dari semua elemen dalam kelompok kedua. Ini dapat dilakukan denganO(m/ √n--√≤m≤n m/4 panggilan ke kotak hitam. (Saya akan jelaskan nanti.) Kemudian gunakan quicksort dengan algoritma partisi ini:O(m/n−−√)
Dengan asumsi setiap langkah partisi membutuhkan panggilan ke kotak hitam, algoritma di atas, diberi inputA[1 ..n], akan menghasilkanO( √O(m/n−−√) A[1..n] memanggil ke kotak hitam, karena pohon rekursi memiliki kedalamanO(logn)dan setiap tingkat pohon memiliki totalO(n/ √O(n−−√logn) O(logn) panggilan ke kotak hitam.O(n/n−−√)=O(n−−√)
Lakukan langkah pemartisian sebagai berikut:
sumber
Saya pikir pertanyaan Anda telah dialamatkan dalam makalah Beigel dan Gill " Menyortir n objek menggunakan k-sorter " dari tahun 1990 dan abstrak makalah ini mengatakan semuanya:
sumber
Hal ini dimungkinkan untuk memilah obliviously dengan panggilan ke kotak hitam, masing-masing diterapkan pada subarray yang berdekatan dari input asli. Algoritma tidak pernah menyentuh data input kecuali melalui panggilan kotak hitam. Secara khusus, urutan yang sama dari panggilan kotak hitam hanya fungsi darin, bukan data input aktual (karenanya "tidak menyadari").O ( n--√logn ) n
Berikut ini adalah sketsa dari algoritma yang lebih sederhana, yang menggunakan kotak hitam yang mengurutkan subarrays dari ukuran bukan hanya √k . Jumlah total panggilan ke kotak hitam kira-kira2(n/k)2. Untuk kesederhanaan notasi, asumsikan bahwakadalah genap dan2n/kadalah bilangan bulat ganjil.n--√ 2 ( n / k )2 k 2 n / k
Berikut adalah diagram algoritma untuk dan k = 4 . Data bergerak dari kiri ke kanan; setiap kotak adalah k -sorter.n = 18 k = 4 k
sumber