Penyortiran patologis
Bos Anda menuntut Anda mengembangkan algoritma penyortiran untuk meningkatkan kinerja aplikasi perusahaan Anda. Namun, setelah menulis aplikasi, Anda tahu bahwa Anda tidak mungkin membuatnya lebih cepat secara signifikan. Tidak ingin mengecewakan bos Anda, Anda telah memutuskan untuk mengembangkan algoritma baru yang bekerja lebih baik daripada * mengurutkan pada set data tertentu. Tentu saja, Anda tidak dapat membuatnya jelas bahwa algoritme hanya berfungsi pada beberapa kasus, jadi Anda ingin membuatnya tidak jelas.
Tujuan dari kontes ini adalah untuk menulis rutin penyortiran dalam bahasa pilihan Anda yang berkinerja lebih baik pada set data tertentu daripada yang lain, dengan hasil yang berulang. Semakin spesifik klasifikasi yang menentukan kecepatan, semakin baik. Algoritme harus melakukan semacam penyortiran, sehingga suatu algoritma yang bergantung pada data yang sudah sepenuhnya diurutkan (seperti dalam, suatu algoritma yang tidak melakukan apa-apa), atau suatu algoritma yang tergantung pada data yang sepenuhnya diurutkan secara terbalik, keduanya tidak valid. Algoritma pengurutan harus dengan benar mengurutkan setiap set data.
Setelah mempresentasikan rutinitas Anda, harap sertakan penjelasan mengapa itu hanya bekerja pada set data tertentu, dan sertakan uji coba pada setidaknya satu set data baik (cepat) dan satu set data buruk (lambat). Intinya di sini adalah untuk dapat membuktikan kepada atasan Anda bahwa Anda telah menemukan cara yang lebih baik untuk menyortir, sehingga lebih banyak data uji lebih baik. Tentu saja, Anda hanya akan menunjukkan kepada bos Anda hasil tes dari data yang baik, sehingga kesalahan dalam data pengujian yang diperlukan tidak terlalu jelas. Jika berlaku untuk bahasa Anda, harap tunjukkan bahwa algoritme Anda lebih cepat daripada algoritme penyortiran bawaan bahasa Anda.
Sebagai contoh, seseorang dapat mengirimkan algoritma penyisipan, dengan data yang baik adalah data yang sudah hampir diurutkan, dan data yang buruk menjadi data yang benar-benar acak, karena pendekatan penyisipan mendekati O (n) pada data yang hampir diurutkan. Namun, ini tidak terlalu baik, karena bos saya mungkin akan memperhatikan bahwa semua data pengujian hampir diurutkan sejak awal.
Ini adalah kontes popularitas , jadi jawabannya dengan suara terbanyak setelah 7 hari (21 Mei) menang.
Jika tidak ada yang mengalahkan saya, saya ingin mengirimkan jawaban wiki komunitas yang memanfaatkan kumpulan data yang terdistribusi secara seragam.
sumber
Jawaban:
Sudah cukup lama, tapi saya ingat kembali di Algoritma 101 kami diajarkan beberapa algoritma penyortiran yang menggunakan pengacakan. Saya bukan murid yang sangat baik sehingga saya tidak begitu ingat bagaimana hasilnya atau mengapa rata-rata bekerja dengan cepat.
Namun demikian, saya telah memutuskan bahwa masalah ini memerlukan solusi yang menggunakan pengacakan, yang diharapkan akan bekerja sesuai keinginan saya rata-rata.
Karena pengacakan yang benar itu penting, saya memastikan untuk menabur RNG dengan jawaban untuk Kehidupan, Semesta dan Segalanya. Setelah sedikit pengujian ternyata itu langkah yang cerdas! Lihat seberapa cepat 2 daftar yang sepenuhnya arbitrer ini diurutkan:
Keduanya disortir hanya dalam 1 iterasi - Anda tidak mungkin meminta fungsi yang lebih cepat dari itu!
Sekarang, harus diakui, beberapa daftar lain menghasilkan hasil yang sedikit lebih buruk ...
Ini disortir dalam iterasi 4.176 dan 94.523 masing-masing, yang sebenarnya membutuhkan waktu lebih dari satu detik ... tapi mari kita simpan fakta itu untuk diri kita sendiri agar tidak mengganggu siapa pun dari betapa menakjubkannya algoritma ini!
Edit:
Saya diminta membuktikan efisiensi algoritme saya pada daftar 100 item, jadi begini:
Bahkan daftar panjang dan sepenuhnya sewenang-wenang ini akan diurutkan secara instan! Sungguh, saya harus menemukan algoritma penyortiran terbaik di dunia!
sumber
Jika Anda dapat membuat data Anda sendiri, maka itu cukup mudah - dapatkan data yang terlihat acak, tetapi sertakan kunci untuk penyortiran yang lebih cepat. Semua data lain menggunakan metode penyortiran asli, jadi rata - rata lebih baik.
Salah satu cara mudah adalah memastikan setiap item data memiliki kunci unik, dan kemudian hanya hash kunci. Ambil contoh daftar dengan angka 1-10.000, semuanya dikalikan 16, dan dengan angka acak 0-15 ditambahkan padanya (lihat fillArray () di bawah). Mereka akan terlihat acak, tetapi masing-masing memiliki kunci berurutan yang unik. Untuk menyortir, bagi dengan 16 (dalam C >> 4 sangat cepat) dan kemudian hanya menempatkan angka ke dalam array menggunakan kunci yang dihasilkan sebagai indeks. Satu lulus dan Anda selesai. Dalam pengujian, saya menemukan quicksort 30 kali lebih lambat dari sepuluh juta angka.
Apa pun yang memiliki kunci unik dapat diurutkan dengan cara ini - jika Anda memiliki memori untuk menyimpannya, tentu saja. Sebagai contoh, banyak database menggunakan id pelanggan numerik yang unik - jika daftarnya cukup kecil / berurutan ini dapat disimpan dalam memori. Atau cara lain untuk menerjemahkan rekaman ke nomor unik. Untuk info lebih lanjut, teliti Hash Macam, karena memang begitulah ...
sumber