Pertimbangkan masalah berikut:
Input : daftar bilangan bulat
Sasaran : menentukan apakah ada bilangan bulat yang ada di kedua daftar.
Misalkan kedua daftar ukuran Y adalah . Apakah ada algoritma deterministik, linear-waktu untuk masalah ini? Dengan kata lain, dapatkah Anda menyelesaikan masalah ini dalam waktu deterministik, tanpa menggunakan keacakan?
Sayangnya, Anda tidak dapat mengasumsikan bahwa elemen daftar semuanya kecil.
Saya bisa melihat bagaimana menyelesaikannya dalam waktu yang diharapkan menggunakan algoritma acak: secara acak memilih fungsi hash 2-universal , menyimpan elemen ke dalam hashtable (menggunakan sebagai fungsi hash), dan kemudian mencari setiap elemen untuk melihat apakah itu ada dalam hashtable. Waktu berjalan yang diharapkan adalah . Namun, saya tidak dapat melihat bagaimana menemukan algoritma deterministik dengan waktu berjalan. Jika Anda mencoba untuk derandomisasi ini dan memperbaiki fungsi hash tunggal tertentu, akan ada input terburuk yang menyebabkan prosedur ini berjalan di waktu. Algoritma deterministik terbaik yang dapat saya temukan melibatkan pengurutan nilai, tetapi itu tidak akan linear-waktu. Bisakah kita mencapai waktu berlari linier?
Juga, saya bisa melihat bagaimana menyelesaikannya dalam waktu linier jika Anda mengasumsikan bahwa semua elemen daftar adalah bilangan bulat dalam kisaran (pada dasarnya, jangan menghitung semacam) - tetapi saya tertarik pada apa yang terjadi pada umumnya kasus ketika kita tidak bisa menganggap itu.
Jika jawabannya tergantung pada model perhitungan, model RAM langsung masuk ke pikiran, tetapi saya akan tertarik pada hasil untuk setiap model perhitungan yang masuk akal. Saya mengetahui batas bawah untuk algoritma pohon keputusan untuk keunikan elemen , tetapi ini tidak pasti, karena kadang-kadang kita dapat menemukan algoritma linear-waktu bahkan ketika ada Ω ( n log n ) terikat dalam model pohon keputusan.
Jawaban:
Anda dapat memecahkan masalah dalam waktu linier jika Anda memiliki cukup memori untuk memiliki sedikit untuk setiap nilai yang mungkin dalam X dan Y. Ini tidak memaksakan pembatasan pemesanan X dan Y.
sumber
Karena Anda mengatakan bahwa kedua daftar berisi bilangan bulat, saya kira kita dapat menjalankan semacam radix pada dua daftar dan kemudian melakukan pencarian linear membandingkan dua daftar untuk item yang setara.
sumber
Mengapa tidak memasukkan bilangan bulat dari setiap daftar ke dalam trie bitwise sederhana? Apakah ini tidak optimal, dalam arti bahwa itu adalah , di mana ¯ m adalah ukuran bit rata-rata dari bilangan bulat; secara khusus, saya tidak melihat bagaimana Anda dapat melakukan yang lebih baik, karena hanya * membaca * kedua daftar akan mengambil jumlah waktu ini.O(n⋅m¯¯¯¯¯) m¯¯¯¯¯
sumber
sumber