Dapatkah keunikan elemen diselesaikan dalam waktu linier deterministik?

9

Pertimbangkan masalah berikut:

Input : daftar X,Y bilangan bulat

Sasaran : menentukan apakah ada bilangan bulat x yang ada di kedua daftar.

Misalkan kedua daftar X,Y ukuran Y adalah n . Apakah ada algoritma deterministik, linear-waktu untuk masalah ini? Dengan kata lain, dapatkah Anda menyelesaikan masalah ini dalam waktu O(n) deterministik, tanpa menggunakan keacakan?

Sayangnya, Anda tidak dapat mengasumsikan bahwa elemen daftar semuanya kecil.


Saya bisa melihat bagaimana menyelesaikannya dalam O(n) waktu yang diharapkan menggunakan algoritma acak: secara acak memilih fungsi hash 2-universal h , menyimpan elemen X ke dalam hashtable (menggunakan h sebagai fungsi hash), dan kemudian mencari setiap elemen Y untuk melihat apakah itu ada dalam hashtable. Waktu berjalan yang diharapkan adalah O(n) . Namun, saya tidak dapat melihat bagaimana menemukan algoritma deterministik dengan O(n) waktu berjalan. Jika Anda mencoba untuk derandomisasi ini dan memperbaiki fungsi hash tunggal tertentu, akan ada input terburuk yang menyebabkan prosedur ini berjalan diΘ(n2) 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 [1,n] (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.Ω(nlogn) Ω(nlogn)

DW
sumber
Hashtable adalah O (n log n) karena Anda perlu menangani tabrakan.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen, saya tidak melihat dari mana Anda mendapatkan itu. Menggunakan fungsi hash 2-universal dan tabel hash berukuran sesuai memastikan bahwa jumlah tabrakan hash minimal (dengan probabilitas tinggi), jadi saya percaya waktu berjalan dapat dicapai. Saya tidak yakin dari mana Anda mendapat O ( n lg n ) dari; jika Anda tidak melakukan sesuatu yang istimewa (seperti menggunakan hashing 2-universal), kasus terburuk adalah O ( n 2 ) , karena tabrakan. O(n)O(nlgn)O(n2)
DW
Iblis ada dalam rincian, di sini "tabel hash berukuran sesuai". Ini mungkin berubah menjadi cukup besar, jika Anda tidak ingin tabrakan. Tipikal n-log-n adalah (jika saya ingat dengan benar) untuk menangani tabrakan fungsi hash dengan sebuah daftar.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen Jumlah pemetaan kunci yang diharapkan ke alamat yang sama adalah konstan (untuk tabel yang tidak kelebihan beban), sehingga jenis resolusi tabrakan tidak relevan. Lihat juga di sini . cocok dengan kasus terburuk jika Anda menggunakan BST (eksternal) seimbang sebagai pengganti daftar. O(nlogn)
Raphael

Jawaban:

1

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.

  1. Awalnya semua bit tidak disetel.
  2. Iterate over X mengatur bit yang sesuai.
  3. Iterate over Y checking jika bit yang sesuai diatur di atas.
Thorbjørn Ravn Andersen
sumber
2
Sayangnya, Anda tidak dapat mengasumsikan bahwa semua bilangan bulat kecil (Anda tidak dapat menganggap mereka cukup kecil sehingga algoritma ini akan berfungsi). Dalam kasus umum, waktu berjalan dari algoritma ini akan eksponensial dalam bit-length dari elemen daftar. Terima kasih!
DW
Sebut saja "bit-array ukuran yang sesuai". Juga linear dalam bit-length setara dengan log-n. Apakah Anda serius mendapatkan kinerja log-n tanpa batasan atau prasyarat pada data input?
Thorbjørn Ravn Andersen
2
@ ThorbjørnRavnAndersen Ruang ini eksponensial dalam panjang bit (Anda perlu memetakan dari semua nilai yang mungkin), dan waktunya linier dalam ukuran total daftar (Anda perlu melihat semua nilai di kedua daftar). Tidak ada yang linear dalam bit-length.
wchargin
0

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.

anirudh
sumber
4
Ini hanya bekerja jika ada batasan pada besarnya angka.
Luke Mathies pada
tapi saya pikir magnitudo tinggi akan menjadi masalah hanya untuk menghitung sort dan untuk radix sort kita dapat memilih radix yang cukup tinggi untuk menyelesaikan masalah itu ... tolong beri tahu saya apa yang saya lewatkan di sini
anirudh
Bagaimana jika salah satu angka adalah 2 ^ (2 ^ 128)?
miniBill
@anirudh tetapi kemudian Anda memiliki algoritme yang berbeda untuk ukuran input yang berbeda - Anda memerlukan alfabet yang lebih besar setiap kali Anda meningkatkan radix, Anda hanya mengekspor kompleksitas peningkatan besaran untuk meningkatkan ukuran alfabet. Tentu saja ini hanya mungkin dalam teori juga, saya tidak berpikir banyak perangkat keras memungkinkan Anda untuk mengubah basis yang mewakili angka (kita bisa berpura-pura pada input dan output berakhir, tetapi itu bermuara pada (sebagian besar) biner ).
Luke Mathies pada
0

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(nm¯)m¯

Realz Slaw
sumber
Terima kasih atas catatan Anda. Lihat paragraf terakhir dari pertanyaan, yang membahas poin ini. Dalam model RAM, Anda dapat membaca dua daftar dalam waktu - tidak butuh waktu O ( n \ overbar m ) . Jadi di situlah model perhitungan datang ke dalamnya - jawaban ini sebenarnya tidak membuktikan bahwa waktu linear deterministik tidak mungkin. O(n)O(n\overbarm)
DW
@DW Dalam model RAM, ada ukuran kata yang konstan, dan itu Bounds m dan dengan demikian juga ¯ m , yang hasil dalam runtime dari O ( n ) , atau aku salah? wmm¯O(n)
Realz Slaw
hmm mungkin mempertimbangkan konstan adalah kesalahan. w
Realz Slaw
wnmnnm
-1

O(nlogn)

Omer Gold
sumber
1
Pertanyaannya cukup eksplisit tentang waktu deterministik linier, bukan log-linear. Juga untuk menentukan apakah (bukan pada nilai apa) set hanya memiliki elemen unik yang dapat Anda lakukan lebih cepat daripada loglinear.
Jahat
1
Maksud kamu Ω(ncatatann)? Jika demikian, itu mungkin menunjukkan bahwa masalah dalam pertanyaan tidak dapat diselesaikan dalam waktu linier. Tetapi hanya mengatakan bahwa masalah terkait dapat diselesaikan dalam waktu log-linear tidak benar-benar menjawab pertanyaan. (cc @EvilJS)
David Richerby
1
Terima kasih atas catatan Anda. Saya ingin tahu apakah Anda melewatkan kalimat terakhir dari pertanyaan itu. Saya akan mengulanginya di sini: "Saya sadarΩ(ncatatann) batas bawah untuk algoritma pohon keputusan untuk keunikan elemen , tapi ini tidak pasti, karena kadang-kadang kita dapat menemukan algoritma linear-waktu bahkan ketika adaΩ(ncatatann)terikat dalam model pohon keputusan. "Dengan kata lain, jawaban ini tidak menjawab pertanyaan; itu hanya mengulangi sesuatu yang sudah saya katakan dalam pertanyaan yang saya sadari, tetapi yang tidak menyelesaikan pertanyaan.
DW
Itu bisa dilakukan di HAI(ncatatancatatann) waktu yang lebih baik dari yang diberikan HAI(ncatatann), jadi saya yakin ini bukan Ω(ncatatann), tapi ini tidak menyelesaikan pertanyaan DW. Jadi komentar saja di sini.
Evil