Pertimbangkan masalah berikut:
Input: dua array dan dengan panjang , di mana berada dalam urutan urutan.
Pertanyaan: apakah dan berisi item yang sama (dengan multiplisitasnya)?
Apa algoritma deterministik tercepat untuk masalah ini?
Apakah bisa diselesaikan lebih cepat daripada menyortirnya? Bisakah masalah ini diselesaikan dalam waktu linier deterministik?
algorithms
reference-request
sorting
Albert Hendriks
sumber
sumber
Jawaban:
Anda belum menentukan model perhitungan Anda, jadi saya akan menganggap model perbandingan.
Pertimbangkan kasus khusus di mana array diambil dari daftar { 1 , 2 } × { 3 , 4 } × ⋯ × { 2 n - 1 , 2 n } . Dengan kata lain, elemen ke- i adalah 2 i - 1 atau 2 i .B
Saya mengklaim bahwa jika algoritma menyimpulkan bahwa dan B mengandung unsur-unsur yang sama, bahwa algoritma telah dibandingkan setiap elemen dalam B untuk rekan di A . Memang, anggaplah bahwa algoritma menyimpulkan bahwa A dan B mengandung unsur-unsur yang sama, tetapi tidak pernah membandingkan elemen pertama dari B dengan mitranya di A . Jika kita mengganti elemen pertama maka algoritme akan berjalan dengan cara yang persis sama, meskipun jawabannya berbeda. Ini menunjukkan bahwa algoritma harus membandingkan elemen pertama (dan unsur lainnya) dengan mitranya di A .A B B A A B B A A
Ini berarti bahwa jika dan B mengandung elemen yang sama, maka setelah memverifikasi ini algoritma mengetahui urutan A yang diurutkan . Karena itu ia harus memiliki setidaknya n ! daun berbeda, dan karena itu butuh waktu Ω ( n log n ) .A B A n! Ω(nlogn)
sumber
Kesimpulannya, jika kita memilih ukuran acak kira-kira antara sekumpulan setidaknya bilangan prima yang berbeda, dan modulo acak , maka ketika array tidak mengandung elemen yang sama, pengujian kami akan gagal dengan probabilitas . Menjalankan tes membutuhkan waktu karena cocok dengan jumlah kata mesin yang konstan.p n2 n2 x0 p 1−O(1/n) O(n) p
Menggunakan pengujian waktu polinomial waktu dan karena densitas bilangan prima ukuran kira-kira adalah , kita dapat memilih prime waktu secara acak . Memilih acak modulo dapat diimplementasikan dalam berbagai cara, dan dibuat lebih mudah karena dalam kasus kami, kami tidak perlu acak-benar seragam .n2 Ω(1/logn) p (logn)O(1) x0 p x0
Kesimpulannya, algoritma kami berjalan dalam waktu , selalu menampilkan YA jika array berisi elemen yang sama, dan menghasilkan TIDAK dengan probabilitas jika array tidak mengandung elemen yang sama. Kita dapat meningkatkan probabilitas kesalahan untuk untuk setiap konstan .O(n) 1−O(1/n) 1−O(1/nC) C
sumber
saya akan mengusulkan algoritma lain (atau setidaknya skema algoritma seperti itu)
Skema ini mengasumsikan nilai-nilai (diasumsikan " bilangan bulat ") berada dalam kisaran (sempit?) Antara[min,max]
Dalam waktu memindai dua array, kita dapat menemukan dan nilai untuk keduanya dan multiplisitasnya, jika ini berbeda, array tidak permutasi satu sama lainO(n)
min
max
Kurangi
min
dari semua nilai dari kedua array (di sini fakta bahwa satu array sudah dalam urutan diurutkan tidak diperhitungkan, mungkin ini dapat ditingkatkan)Asumsikan nilai dalam array mewakili massa dan kami menerapkan akselerasi / kecepatan untuk masing-masing besarnya (ini dapat ditingkatkan ke besarnya dalam kasus-kasus tertentu)1 c>1
gerakkan massa hingga mencapai nilai maksimumO((max−min)n)
max-min
, ini memiliki kompleksitas . Hal ini memungkinkan untuk menemukan nilai yang sama dan multiplisitasnya, jika berbeda, array tidak permutasi satu sama lain. Lain memutuskan array adalah permutasi satu sama lain.perhatikan skema algoritma di atas dapat (deterministik) cukup cepat dalam banyak situasi praktis.
Skema algoritma di atas adalah variasi pada algoritma pengurutan linear-waktu menggunakan " massa bergerak ". Intuisi fisik di balik algoritma pengurutan " massa bergerak " adalah sebagai berikut:
Asumsikan nilai setiap item sebenarnya mewakili besarnya massa dan bayangkan mengatur semua item dalam garis dan menerapkan gaya akselerasi yang sama.
Kemudian setiap item akan bergerak ke jarak yang terkait dengan massanya, jarak lebih besar lebih kecil dan sebaliknya. Kemudian untuk mengambil item yang diurutkan cukup mengumpulkan item dalam urutan terbalik berdasarkan jarak yang ditempuh.
Algoritma ini linear-waktu dan deterministik , tetapi ada peringatan bahwa jumlah gaya akselerasi awal dan jarak untuk melakukan perjalanan (atau waktu untuk menunggu) terkait dengan distribusi nilai (yaitu " massa ", faktor di atas). Satu juga dapat mencoba untuk mendiskritasikan ruang untuk item untuk melakukan perjalanan ke kotak dan mendapatkan faktor konstan dalam kecepatan algoritma (dan menggunakan rutin penyortiran cepat untuk mengurutkan item yang berbeda dalam sel yang sama ).max−min
Dalam hal ini, algoritma di atas mirip dengan algoritma pengurutan berbasis numerik (mis. Radix-sort , menghitung-sort )
Orang mungkin berpikir bahwa algoritma ini mungkin tidak berarti banyak, tetapi itu menunjukkan setidaknya satu hal. Bahwa, " mendasar ", pada tingkat fisik, menyortir angka acak adalah operasi linier dalam jumlah item.
sumber