Pembaruan: Saya memperluas jawaban ini menjadi makalah Menyortir dengan rata-rata perbandinganlg(n!)+o(n) .
Ya, algoritma seperti itu ada. Saya hanya akan membuktikan terikat, tetapi dengan asumsi pengacakan yang mungkin kita juga mendapatkan . Saya juga akan menjelaskan upaya untuk dan .lg(n!)+o(n)lg(n!)+O(n1−ε)n0.5+o(1)O(n0.5−ε)
Kita dapat mengasumsikan bahwa semua elemen berbeda, dengan memberi anotasi jika perlu; case rata-rata menggunakan elemen berbeda dalam urutan acak. Kami dapat menghitung jumlah rata-rata perbandingan dengan menambahkan kerugian entropi untuk setiap perbandingan relatif terhadap menggunakan koin yang adil.
Titik awal adalah penyisipan sortir dengan pencarian biner untuk memutuskan di mana memasukkan elemen berikutnya ke dalam subset diurutkan . Kapan , penyisipan menggunakan paling banyak perbandingan , yang (dalam hal entropi) optimal hingga faktor aditif (dan untuk kompleksitas kasus rata-rata, juga berfungsi). Sekarang, ketikatidak mendekati kekuatan 2, penyisipan elemen adalah suboptimal (bahkan dalam kasus rata-rata dan terlepas dari bagaimana kita menyeimbangkan setiap permintaan), tetapi jika membuang perbandingan, kita bisa mengarahkan ke distribusi yang kurang lebih seragam lebih dari satu intervalS(1−ε)2m≤|S|≤2m−1mO(ε)2m≤|S|≤(1+ε)2m|S|Ao(1)AS panjang dekat dengan kekuatan 2, kita mendapatkan optimalitas yang diinginkan.
Kami mencapai ini dengan menambahkan elemen dalam batch, dan kadang-kadang secara efisien membandingkan elemen batch dengan satu sama lain, sehingga interval sesuai dengan elemen berkurang secara acak (dan dengan distribusi probabilitas di dalam interval) hampir seragam), dan ketika panjang interval cukup dekat dengan kekuatan 2, melakukan pencarian biner untuk menyisipkan .A A ASAAA
Konstruksi umum
Kami akan menyimpan subset elemen yang diurutkan, dan untuk setiap elemen disortir , kami akan melacak interval minimal dari mana diketahui berada. adalah panjang ; adalah dengan identitas interval.A I A S A | I A | I A I A = I BSAIASA|IA|IAIA=IB
Misalkan menjadi: Bandingkan dengan , dan kemudian (dalam urutan acak) membandingkan dan terhadap elemen sesuai sampai intervalnya terpisah (atau memiliki panjang 1). Elemen dipilih (secara konsisten) untuk membuat probabilitas untuk perbandingan sedekat 1/2 mungkin, dengan asumsi bahwa ketika dipanggil, didistribusikan secara seragam pada . Karena ketidakjelasan pada akhirnya, mempertahankan asumsi keseragaman.A B A B S S C o m p a r e ( A , B ) I A ⨯ I B C o m p a r eCompare(A,B)ABABSSCompare(A,B)IA×IBCompare
Bagian berikut ini dapat dibaca secara terpisah satu sama lain.
Algoritma Alg(n!)+o(n)
Diberikan: Daftar diurutkan , dan kumpulan elemen yang tidak disortir; ; elemen disortir relatif acak untuk .m m ∈ ω ( 1 ) ∩ o ( | S | ) SSmm∈ω(1)∩o(|S|)S
Ulangi (1) - (3) selagi memungkinkan:
1. Pilih dua elemen dan dari batch dengan (pilihan apa pun akan berhasil).
2. Jalankan .
3. Jikacukup dekat dengan kekuatan 2, (catatan 1) menghapus dari batch (tanpa melupakan ); dan melakukan sama dengan . Akhirnya: Masukkan semua elemen ke dan lengkapi pengurutan.B I A = I B C o m p a r e ( A , B ) | I A | A I A B SABIA=IB
Compare(A,B)
|IA|AIAB
S
Catatan 1: Untuk "cukup dekat", setiap kesalahan relatif (sebagai fungsi dari ) bekerja selama elemen akan dihapus pada langkah (4) (mungkin dengan catatan 2). Di bawah asumsi pengacakan terkira, menggunakan kesalahan relatif menangkap elemen , memungkinkan Algoritma pengurutan perbandingan rata-rata .m m - o ( m ) c log log m / log m m ( 1 - log - Θ ( c ) m ) l g ( n ! ) + O ( n log log n / log n )o(1)mm−o(m)cloglogm/logmm(1−log−Θ(c)m)lg(n!)+O(nloglogn/logn)
Catatan 2: Karena urutan perbandingan yang sama mengarah ke interval terikat yang sama, hampir semua elemen akan melalui langkah (1) kali (kecuali dihilangkan pada langkah 4). Pada awalnya, jika dan kami memilih , kami membandingkan terhadap elemen , dan setiap aplikasi langkah (3) ke memiliki kemungkinan mengurangidalam kali. Sekarang untuk setiap rasio yang bukan kekuatan rasional 2, kami memiliki , jadi kita mendapatkanA < B A A S [ ≈ ( 1 - 1 / √Ω(logm)A<BAAAO(1)| IA| ≈1/(1-1/ √S[≈(1−1/2–√)|S|]AO(1)|IA|a>1∀ε>0∀d>0∃m,n∈N≈1/(1−1/2–√)a>1o(n)∀ε>0∀d>0∃m,n∈N1−ε<amd2n<1+εo(n) terikat.
Kemungkinan algoritmalg(n!)+O(n1−ε)
Dengan asumsi pengacakan, kita dapat mencapai perbandingan rata-rata sebagai berikut.lg(n!)+O(n1−ε)
Acak item secara acak, dan urutkan bagian pertama ke dalam daftar , sambil menjaga bagian kedua sebagai batch yang tidak disortir.S
Ulangi sampai kumpulan kosong:
Pilih secara acak . Misalkan . Jika kosong, menghapus dari batch dan masukkan ke . Jika tidak:G = { B ∈ batch : | P ( A < B ) - 0,5 | < n - 0,51 ε } G A SA∈batchG={B∈batch:|P(A<B)−0.5|<n−0.51ε}GAS
- Jika ada sedemikian rupa sehingga dengan probabilitas (katakan ≥0.05), menghasilkandalam kesalahan relatif dari kekuatan 2, jalankan dan jika berhasil (yaitu berada dalam kesalahan relatif dari kekuatan 2) , menghapus dari batch dan masukkan ke .B∈GΘ(1)Compare(A,B)|IA|n−εCompare(A,B)|IA|n−εAS
- Jika tidak ada seperti , jalankan untuk acak .B∈GCompare(A,B)B∈G
Jika asumsi pengacakan kami berhasil (yaitu distribusi panjang interval dan posisi cukup acak), maka di sebagian besar proses, tipikal dapat secara efisien dibandingkan dengan pilihan elemen (dengan panjang interval berbeda). Jadi, kita biasanya dapat memilih perbandingan untuk (1) di atas, dan jika kita tidak beruntung dengan hasil perbandingan, kita masih mendapatkan peluang, dengan demikian mencapai (jika cukup kecil, katakan 0,01) a algoritma perbandingan. Dengan beberapa perubahan dan perkiraan, penghitungan total dapat dilakukan sesekali: Diberikan elemenAnΘ(1)nΘ(1)Θ(logn)εlg(n!)+O(n1−ε)A, hitung panjang interval yang menjanjikan, dan kemudian cari dengan perkiraan panjang pusat dan interval yang tepat.B
Ada beberapa cara untuk mengoptimalkan perbandingan, tetapi kendalanya adalah bahwa setiap perbandingan mungkin berakhir dengan ketidakberuntungan dan kami memiliki sejumlah perbandingan. Jika setelah optimasi, melakukan rata-rata 4 perbandingan dan 'berhasil' dengan probabilitas 1/4, kita mendapatkan .Compare(A,B)ε≈(1−ε)/4/log4/32≈0.09
Pendekatan yang mungkin jauh lebih baik adalah menunggu sampai interval mendekati kekuatan 2, bukan mengontrol panjang interval individu tetapi distribusi panjang.
Upaya pada algoritmalg(n!)+n0.5+o(1)
Misalkan dan kami diberi kumpulan elemen tidak disortir dengan interval juga diberikan, denganbiasanya dan dengan didistribusikan secara seragam (hingga kesalahan acak, dan tahan dengan presisi yang memadai bahkan jika dikondisikan pada ). Kemudian, kita dapat mengurutkan item yang membuang rata-rata perbandingan sebagai berikut:
(*) Masukkan semua elemen dalam urutan awal . Dengan cara ini semua elemen dimasukkan ketika panjang intervalnya mendekati kekuatan 2.|S|=nnIA|IA|n1−o(1)|IA|2⌊lg|IA|⌋A<S[i]n0.5+o(1)
|IA|2⌊lg|IA|⌋
Algoritma pengurutan akan menjadi: Acak acak daftar dan urutkan setengah pertama . Untuk menyisipkan bagian kedua, buat distribusi benar, dan lakukan (*) di atas.S
Untuk membuat distribusi benar, kita dapat membuat distribusi 'acak', dan kemudian menahan fraksi elemen yang tepat untuk setiap saat mengacak sisanya (ulangi jika perlu). Namun, sementara ini harus memperbaiki secara global, kita tidak tahu apakah itu dapat dikontrol secara lokal dengan presisi yang diperlukan (karenanya kata "upaya" di atas).|IA|2⌊lg|IA|⌋|IA|/2⌊lg|IA|⌋|IA|2⌊lg|IA|⌋
Untuk membuat distribusi 'acak', kita dapat secara acak menggunakan dengan , kecuali bahwa dengan awal semuanya identik, kita tidak mengharapkan pengacakan pada kedalaman sublogaritmik (Yaitu dengan cukup lama). Namun, saya menduga bahwa kita mendapatkan pengacakan pada kedalaman sublogaritmik menggunakan generalisasi (mungkin setiap pilihan yang masuk akal akan bekerja) dari elemen ke : Jika kita membiarkan elemen terjerat (yaitu Koneksi menggunakan hasil perbandingan), kita harus memiliki sekitar noncommuting pilihan untuk setiap perbandingan dengan . Ini harus memungkinkanCompare(A,B)P(A<B)≈0.5IAIAComparek=ω(1)k=ω(1)kSO(logkn+logk)kedalaman pengacakan, seperti yang diinginkan (dengan asumsi bahwa tidak terlalu besar seperti yang kita butuhkan kedalaman untuk menguraikan elemen). Saya berharap bahwa penghitungan dapat dibuat quasilinear jika menggunakan cukup kecil .kΘ(logk)k
Karena perbandingan dengan ya probabilitas hanya memboroskan entropi , pengacakan awal dan sedikit ketidakseragaman elemen dalam interval pembatasnya hanya perlu limbah entropi. Jika bentuk distribusi berhasil cukup baik, limbah entropi terutama berasal dari ketidakcocokan panjang interval selama (*) (maka ).1/2+n−0.5O(1/n)no(1)n0.5+o(1)
Kemungkinan Kombinasi:lg(n!)+O(n0.5−ε) Jika membentuk distribusi bekerja cukup baik dan kami membuat ukuran batch yang sama dan menolak secara selektif dalam (*) (di atas), kita dapat memasukkan semua selain dengan limbah entropi sebagai berikut. Membagi menjadi interval yang hampir sama, dan ketika selama penyisipan, menetap pada suatu interval, tolak (yaitu membatalkan penyisipan) jika intervalnya terlalu panjang, sehingga mengurangi variasi dalam panjang interval ini|S|+n0.5+ε≈n0.5+ε≈n0.5+εn0.5−ε/2+o(1)SnεIAΘ(nε/2)kali, yang pada gilirannya mengurangi variasi panjang panjang acak interval dalam kali, sesuai kebutuhan. Sekarang, kita dapat menggunakan algoritma untuk memasukkan elemen yang tersisa dengan limbah jika kecil cukup. n ε / 2 - o ( 1 ) l g (n!)+O( n 1 - ε )O( n 0,5 - ε ′ ) εn1−o(1)nε/2−o(1)lg(n!)+O(n1−ε)O(n0.5−ε′)ε
Kompleksitas penyortiran kasus terburuk: Kemungkinan besar, ada algoritma penyortiran dengan perbandingan kasus terburuk. Untuk menemukan median, ada kesenjangan linear antara perbandingan kasus rata-rata ( ) dan kasus terburuk (setidaknya perbandingan). Namun, untuk penyortiran, ada banyak kebebasan untuk mengatur perbandingan dan untuk menemukan algoritma penyortiran baru.1.5 n + o ( n ) ( 2 + ε ) n - O ( 1 )lg(n!)+o(n)1.5n+o(n)(2+ε)n−O(1)