Rekan kerja saya membawa saya kembali ke masa-masa Universitas saya dengan diskusi tentang penyortiran algoritma pagi ini. Kami mengenang tentang favorit kami seperti StupidSort , dan salah satu dari kami yakin kami telah melihat semacam algoritma itu O(n!)
. Itu membuat saya mulai mencari-cari algoritma penyortiran "terburuk" yang bisa saya temukan.
Kami mendalilkan bahwa jenis acak sepenuhnya akan sangat buruk (yaitu mengacak elemen - apakah itu dalam urutan? Tidak? Mengacak lagi), dan saya melihat sekeliling dan menemukan bahwa itu tampaknya disebut BogoSort, atau Macam Monyet, atau kadang-kadang hanya Urutan Acak .
Sortir Monyet tampaknya memiliki kinerja kasus terburuk O(∞)
, kinerja kasus terbaik O(n)
, dan kinerja rata-rata O(n·n!)
.
Apa algoritma pengurutan yang diterima saat ini dengan kinerja pengurutan rata-rata terburuk (dan karena itu menjadi lebih buruk daripada O(n·n!)
)?
Jawaban:
Dari halaman Algoritma Esoterik David Morgan-Mar : Urutan Desain Cerdas
sumber
void quantum_sort (void *b, size_t n, size_t s, int (*c)(const void *, const void*)) { if (rand () % 2) qsort (b, n, s, c); }
."This is the best of all posibble worlds because it is the world that is, and so in the best possible world the array would already be sorted!"
Bertahun-tahun yang lalu, saya menemukan MiracleSort (tetapi tidak pernah benar-benar diterapkan).
Akhirnya, partikel alfa yang membalik bit dalam chip memori akan menghasilkan jenis yang sukses.
Untuk keandalan yang lebih besar, salin array ke lokasi terlindung, dan periksa array berpotensi diurutkan terhadap yang asli.
Jadi, bagaimana Anda memeriksa array yang berpotensi diurutkan terhadap yang asli? Anda cukup mengurutkan setiap array dan memeriksa apakah cocok. MiracleSort adalah algoritma yang jelas digunakan untuk langkah ini.
EDIT: Sebenarnya, ini bukan algoritma, karena tidak dijamin akan berakhir. Apakah "bukan suatu algoritma" memenuhi syarat sebagai "algoritma yang lebih buruk"?
sumber
O(2^N)
?Bogumort Kuantum
Algoritma pengurutan yang mengasumsikan bahwa interpretasi mekanika kuantum banyak dunia adalah benar:
Pada akhir algoritme, daftar akan diurutkan dalam satu-satunya alam semesta yang tersisa. Algoritma ini membutuhkan waktu kasus terburuk O (N) dan kasus rata-rata O (1). Faktanya, jumlah rata-rata perbandingan yang dilakukan adalah 2: ada kemungkinan 50% bahwa alam semesta akan dihancurkan pada elemen kedua, peluang 25% bahwa itu akan dihancurkan pada elemen ketiga, dan seterusnya.
sumber
Saya terkejut belum ada yang menyebutkan sleepsort ... Atau belumkah saya menyadarinya? Bagaimanapun:
contoh penggunaan:
Dalam hal kinerja itu mengerikan (terutama contoh kedua). Menunggu hampir 3,5 bulan untuk mengurutkan 2 angka agak buruk.
sumber
O(N)
semacam, tetapi sebenarnya dibatasi oleh namun timer OS alat.sleep "$1"
kesleep "0.$(printf "%010d" $1)"
untuk meningkatkan kinerja secara nyata.time ./sleepsort.sh 8864569 7
kemudian berjalan di 0,009 di laptop saya.Sortasi Jingle, seperti dijelaskan di sini .
Anda memberikan setiap nilai dalam daftar Anda kepada anak yang berbeda pada hari Natal. Anak-anak, sebagai manusia yang mengerikan, akan membandingkan nilai hadiah mereka dan menyortir diri mereka sendiri.
sumber
Saya punya dosen yang pernah menyarankan membuat array acak, memeriksa apakah itu diurutkan dan kemudian memeriksa apakah datanya sama dengan array yang akan diurutkan.
Kasus terbaik O (N) (bayi pertama kali!) Kasus terburuk O (Tidak pernah)
sumber
Jika Anda mempertahankan algoritme dengan cara apa pun,
O(n!)
adalah batas atas terburuk yang dapat Anda capai.Karena memeriksa setiap kemungkinan permutasi dari satu set yang akan diurutkan akan mengambil
n!
langkah - langkah, Anda tidak bisa mendapatkan yang lebih buruk dari itu.Jika Anda melakukan langkah-langkah lebih dari itu maka algoritma tidak memiliki tujuan yang sangat berguna. Belum lagi algoritma penyortiran sederhana berikut dengan
O(infinity)
:sumber
Bogobogosort. Ya, itu hal. ke Bogobogosort, Anda Bogosort elemen pertama. Periksa untuk melihat apakah satu elemen diurutkan. Menjadi satu elemen, itu akan menjadi. Kemudian Anda menambahkan elemen kedua, dan Bogosort keduanya sampai diurutkan. Kemudian Anda menambahkan satu elemen lagi, lalu Bogosort. Lanjutkan menambahkan elemen dan Melakukan Bogosorting sampai Anda selesai melakukan semua elemen. Ini dirancang untuk tidak pernah berhasil dengan daftar besar sebelum kematian panas alam semesta.
sumber
Anda harus melakukan penelitian di bidang Algoritma Pessimal dan Analisis Simpleksitas yang menarik . Para penulis ini bekerja pada masalah mengembangkan semacam dengan kasus terbaik pessimal (kasus terbaik bogosort Anda adalah Omega (n), sementara slowsort (lihat kertas) memiliki kompleksitas waktu kasus terbaik non-polinomial).
sumber
Ada semacam yang disebut bogobogosort. Pertama, ia memeriksa 2 elemen pertama, dan bogosort mereka. Selanjutnya periksa 3 pertama, bogosort mereka, dan sebagainya.
Jika daftar ini rusak, kapan saja, akan dimulai lagi dengan melakukan bogosort pada 2 yang pertama lagi. Bogosort biasa memiliki kompleksitas rata-rata
O(N!)
, algoritma ini memiliki kompleksitas rata-rataO(N!1!2!3!...N!)
Sunting : Untuk memberi Anda gambaran tentang seberapa besar angka ini, untuk
20
elemen, algoritma ini membutuhkan rata-rata3.930093*10^158
tahun , jauh di atas panas yang diusulkan kematian alam semesta (jika terjadi)10^100
tahun ,sedangkan pengurutan penggabungan membutuhkan waktu sekitar
.0000004
detik , pengurutan gelembung.0000016
detik , dan bogosort membutuhkan waktu308
bertahun - tahun ,139
berhari-hari ,19
berjam-jam ,35
menit ,22.306
detik , dengan asumsi satu tahun adalah 365,222 hari dan komputer melakukan 250.000.000 32 bit operasi integer per detik.Sunting2 : Algoritma ini tidak selambat jenis keajaiban "algoritma", yang mungkin, seperti jenis ini, akan membuat komputer tersedot ke dalam lubang hitam sebelum berhasil mengurutkan 20 elemtnts, tetapi jika ya, saya akan memperkirakan kompleksitas rata-rata
2^(32(the number of bits in a 32 bit integer)*N)(the number of elements)*(a number <=10^40)
bertahun - tahun ,karena gravitasi mempercepat chip alpha yang bergerak, dan ada 2 ^ N status, yaitu
2^640*10^40
, atau sekitar5.783*10^216.762162762
bertahun - tahun , meskipun jika daftar mulai diurutkan, kompleksitasnya hanya akanO(N)
, lebih cepat daripada menggabungkan jenis, yang hanya N log N bahkan pada kasus terburuk.Sunting3 : Algoritme ini sebenarnya lebih lambat daripada jenis keajaiban karena ukurannya menjadi sangat besar, katakan 1000, karena algoritma saya akan memiliki jangka waktu
2.83*10^1175546
bertahun - tahun , sedangkan algoritma jenis keajaiban akan memiliki jangka waktu1.156*10^9657
bertahun - tahun .sumber
Inilah 2 macam saya datang dengan teman sekamar saya di perguruan tinggi
1) Periksa pesanan 2) Mungkin keajaiban terjadi, buka 1
dan
1) periksa apakah sudah beres, jika tidak 2) masukkan setiap elemen ke dalam sebuah paket dan bangkit kembali dari server yang jauh ke diri Anda sendiri. Beberapa paket tersebut akan kembali dalam urutan yang berbeda, jadi buka 1
sumber
Selalu ada Bogobogosort (Bogoception!). Ia melakukan Bogosort pada himpunan bagian yang semakin besar dari daftar, dan kemudian mulai dari awal lagi jika daftar tersebut tidak pernah diurutkan.
sumber
1 Masukkan barang-barang Anda untuk diurutkan pada kartu indeks
2 Lemparkan ke udara pada hari yang berangin, satu mil dari rumah Anda.2 Lemparkan mereka ke api unggun dan pastikan mereka benar-benar hancur.
3 Periksa lantai dapur Anda untuk pemesanan yang benar.
4 Ulangi jika ini bukan urutan yang benar.
Scenerio kasus terbaik adalah O (∞)
Sunting di atas berdasarkan pengamatan cerdik oleh KennyTM.
sumber
"Kamu ingin jadi apa?" menyortir
Tidak hanya dapat mengimplementasikan nilai O (x) yang mungkin pendek dari tak terbatas, waktu yang diperlukan terbukti benar (jika Anda bisa menunggu selama itu).
sumber
Tidak ada yang lebih buruk daripada tak terbatas.
sumber
Bozo sort adalah algoritma terkait yang memeriksa apakah daftar diurutkan dan, jika tidak, menukar dua item secara acak. Ini memiliki penampilan kasus terbaik dan terburuk yang sama, tetapi saya secara intuitif berharap kasus rata-rata lebih lama dari Bogosort. Sulit untuk menemukan (atau menghasilkan) data apa pun tentang kinerja algoritma ini.
sumber
Segmen π
Asumsikan π berisi semua kemungkinan kombinasi angka hingga. Lihat pertanyaan math.stackexchange
sumber
Kinerja kasus terburuk O (∞) bahkan mungkin tidak menjadikannya suatu algoritma menurut beberapa orang .
Algoritma hanyalah serangkaian langkah dan Anda selalu dapat melakukan yang lebih buruk dengan mengubah sedikit untuk mendapatkan hasil yang diinginkan dalam lebih banyak langkah daripada sebelumnya. Seseorang dapat dengan sengaja menaruh pengetahuan tentang jumlah langkah yang diambil ke dalam algoritma dan membuatnya berhenti dan menghasilkan output yang benar hanya setelah
X
sejumlah langkah telah dilakukan. ItuX
bisa sangat urutan O (n 2 ) atau O (n n! ) Atau apa pun algoritma yang ingin dilakukan. Itu akan secara efektif meningkatkan batas kasus terbaik dan rata-rata.Tetapi skenario terburuk Anda tidak dapat diatapi :)
sumber
Algoritma pengurutan lambat favorit saya adalah jenis antek:
Kompleksitas kasus terburuk adalah
O(n^(log(3) / log(1.5))) = O(n^2.7095...)
.Algoritma pengurutan lambat lainnya sebenarnya bernama slowsort!
Yang ini mengambil
O(n ^ (log n))
kasus terbaik ... bahkan lebih lambat dari antek.sumber
sumber
Halaman ini adalah bacaan menarik tentang topik ini: http://home.tiac.net/~cri_d/cri/2001/badsort.html
Favorit pribadi saya adalah Tom Duff's sillysort:
sumber
Bogosort ganda
Bogosort dua kali dan bandingkan hasilnya (hanya untuk memastikan itu diurutkan) jika tidak melakukannya lagi
sumber
Anda dapat membuat algoritma pengurutan apa pun lebih lambat dengan menjalankan langkah "apakah diurutkan" secara acak. Sesuatu seperti:
sumber
Ya, SimpleSort, secara teori ini berjalan di
O(-1)
bagaimanapun ini setara denganO(...9999)
yang pada gilirannya setara dengan O (∞ - 1), yang seperti itu juga setara dengan O (∞). Berikut ini contoh implementasi saya:sumber
Satu yang baru saja saya kerjakan melibatkan memilih dua poin acak, dan jika mereka berada di urutan yang salah, membalikkan seluruh subrange di antara mereka. Saya menemukan algoritma di http://richardhartersworld.com/cri_d/cri/2001/badsort.html , yang mengatakan bahwa case rata-rata mungkin ada di sekitar O (n ^ 3) atau O (n ^ 2 log n) ( dia tidak begitu yakin).
Saya pikir mungkin untuk melakukannya lebih efisien, karena saya pikir mungkin untuk melakukan operasi pembalikan dalam O (1) waktu.
Sebenarnya, saya baru sadar bahwa melakukan itu akan membuat semua yang saya katakan mungkin karena saya baru menyadari bahwa struktur data yang ada dalam pikiran saya akan menempatkan mengakses elemen acak di O (log n) dan menentukan apakah perlu membalikkan pada O (n ).
sumber
Randomsubsetsort.
Diberikan array elemen n, pilih setiap elemen dengan probabilitas 1 / n, acak elemen-elemen ini, dan periksa apakah array diurutkan. Ulangi sampai diurutkan.
Waktu yang diharapkan dibiarkan sebagai latihan untuk pembaca.
sumber