Struktur data berbasis perbandingan untuk menemukan item

34

Apakah ada struktur data yang mengambil array yang tidak berurutan dari item, melakukan preprocessing di O ( n ) dan menjawab pertanyaan: apakah ada beberapa elemen x dalam daftar, setiap query dalam waktu terburuk O ( log n ) ?nO(n)xO(logn)

Saya benar-benar berpikir tidak ada, jadi bukti bahwa tidak ada juga disambut.

Chi-Lan
sumber
3
(1) Saya tidak tahu mengapa Anda bisa mengatakan "Tentu saja saya mempertimbangkan waktu yang diharapkan," karena Anda tidak menyatakan "diharapkan" dalam pertanyaan Anda sama sekali. Silakan coba untuk menyatakan pertanyaan Anda lebih tepatnya sebelum berkata (2) silakan mendefinisikan “tentu saja.” “Non-hashable.”
Tsuyoshi Ito
2
(1) Begitu. Terima kasih untuk penjelasannya. Jika seseorang bertanya "Apakah Anda peduli dengan waktu berjalan?" Maka jawabannya akan memang "tentu saja." :) (2) Saya pikir bahwa "Satu-satunya tindakan yang diizinkan adalah membandingkan dua nilai dalam daftar" jauh lebih tepat dari sekadar menyatakan "tidak hash." Bisakah Anda mengedit pertanyaan sehingga orang tidak perlu membaca komentar untuk memahami apa yang dimaksud "tidak hash"?
Tsuyoshi Ito
3
Omong-omong, jika Anda tidak dapat membuktikannya, mengapa Anda tahu itu tidak mungkin? Jika ini adalah latihan di buku teks atau kelas, Anda bertanya di situs web yang salah.
Tsuyoshi Ito
6
Apakah ini pertanyaan Anda: Apakah ada struktur data yang mengambil array yang tidak berurutan dari n item, melakukan preprocessing dalam O (n) dan menjawab pertanyaan: apakah ada beberapa elemen x dalam daftar, setiap kueri dalam waktu terburuk O (log n)?
sdcvvc
2
@Filip: Apakah mudah dilihat? Jika itu benar, maka saya setuju bahwa itu menyelesaikan pertanyaan.
Tsuyoshi Ito

Jawaban:

30

Ini bukti bahwa itu tidak mungkin. Misalkan Anda dapat membangun struktur data seperti itu. Bangun itu. Kemudian pilih item secara acak dari daftar, tambahkan ϵ ke masing-masing, di mana ϵ lebih kecil dari perbedaan antara dua item dalam daftar, dan lakukan kueri untuk memeriksa apakah ada item yang dihasilkan di dalam daftar. Anda telah melakukan O ( n ) pertanyaan sejauh ini.n/lognϵϵO(n)

Saya ingin mengklaim bahwa perbandingan yang telah Anda lakukan cukup untuk mengetahui apakah item pada daftar asli lebih kecil dari atau lebih besar dari item baru b . Misalkan Anda tidak tahu. Kemudian, karena ini adalah model berbasis perbandingan, Anda tidak akan tahu apakah a sama dengan b atau tidak, sebuah kontradiksi dari asumsi bahwa struktur data Anda berfungsi.abab

Sekarang, karena item yang Anda pilih adalah acak, perbandingan Anda dengan probabilitas tinggi diberikan informasi yang cukup untuk membagi daftar asli menjadi n / log n daftar masing-masing ukuran O ( log n ) . Dengan mengurutkan masing-masing daftar ini, Anda mendapatkan algoritma pengurutan waktu O ( n log log n ) secara acak hanya berdasarkan perbandingan, suatu kontradiksi.n/lognn/lognO(logn)O(nloglogn)

Peter Shor
sumber
Beberapa petunjuk untuk membantu memahami bukti (dengan asumsi saya mengerti benar sendiri tentu saja): the item harus diisi dengan barang-barang setelah ε telah ditambahkan ke mereka; perbandingan model yang jaminan Anda tahu mana kasus yang b dan a b memegang; yang n / log n daftar berada di 'urutan menaik': setiap elemen dalam daftar yang lebih tinggi lebih tinggi dari setiap elemen dalam daftar yang lebih rendah; setelah pertanyaan awal Anda memiliki informasi yang cukup untuk membuat daftar di sekitar item yang Anda pilih secara acak,bϵababn/logn
Alex ten Brink
(lanjutan) catat bahwa Anda bahkan tidak harus secara eksplisit dapat membuat daftar pada waktu yang disediakan untuk bukti yang dipegang.
Alex ten Brink
Saya tidak diam mengerti bukti ini. Kontradiksi terakhir adalah mematikan "algoritma yang hanya didasarkan pada perbandingan", tetapi pada langkah pertama dari algoritma kami, kami menambahkan untuk setiap item (lebih lanjut, "di mana ϵ lebih kecil daripada perbedaan antara dua item dalam daftar"). Mengapa kami masih dapat dibenarkan bahwa algoritme kami masih hanya berbasis perbandingan jika kami berasumsi bahwa barang kami memiliki total order non-diskrit? ϵϵ
Artem Kaznatcheev
5
@Artem: input asli Anda terdiri dari elemen . Kemudian Anda membangun set baru X = X × { 0 , 1 } ; Anda mewakili asli x X sebagai ( x , 0 ) X ' dan dimodifikasi x + ε sebagai ( x , 1 ) X ' . Sekarang Anda menggunakan algoritma kotak hitam; Algoritma membandingkan elemen-elemen X xXX=X×{0,1}xX(x,0)Xx+ϵ(x,1)XXsatu sama lain; untuk menjawab pertanyaan seperti itu, Anda hanya perlu membandingkan jumlah elemen konstan satu sama lain. Karenanya semuanya harus dapat dilakukan dalam model perbandingan, dengan overhead konstan. X
Jukka Suomela
1
@Aryabhata: ya. Apa itu algoritma ? O(log2n)
Peter Shor
24

Saya percaya di sini adalah bukti yang berbeda, membuktikan ketidakmungkinan struktur waktu permintaan , dengan O ( n ) pra-pemrosesan.O(logkn)O(n)

Misalkan dalam preprocessing Anda melakukan perbandingan , yang mengarah ke urutan parsial.O(n)

Sekarang pertimbangkan ukuran dari barang antik terbesar di dalamnya. Karena elemen-elemen ini tidak dapat dibandingkan, agar kita memiliki algoritma kueri O ( log k n ) , kita harus memiliki A = O ( log k n ) .AO(logkn)A=O(logkn)

Sekarang oleh teorema Dilworth, ada partisi ukuran , menjadi rantai.A

Sekarang kita bisa melengkapi algoritme untuk menentukan rantai di partisi. Kita dapat menentukan apakah dua elemen dapat dibandingkan dengan membuat grafik perbandingan yang diarahkan dan melakukan analisis keterjangkauan. Ini dapat dilakukan tanpa perbandingan tambahan. Sekarang cukup paksa keluar setiap kemungkinan partisi ukuran untuk menentukan apakah itu adalah partisi rantai.A

Setelah kami memiliki rantai, kami dapat menggabungkannya untuk memberikan algoritma perbandingan untuk mengurutkan seluruh daftar.O(nloglogn)

Aryabhata
sumber
1
Ini ide yang bagus. Dan jika Anda dapat menunjukkan bahwa partisi rantai harus diketahui oleh algoritme maka Anda dapat menggunakan mergesort untuk menunjukkan bahwa itu hanya akan mengambil perbandingan O (n log log n) tambahan untuk mengurutkan seluruh input, daripada menggunakan Jensen. Tetapi ada masalah: mengapa algoritma preprocessing harus membangun partisi rantai? Partisi rantai harus ada, ya, tapi itu sangat berbeda dari yang diketahui oleh algoritma.
David Eppstein
8
Ok, sekarang saya percaya bukti ini. Dan itu menunjukkan lebih kuat bahwa untuk mencapai waktu permintaan polylog Anda harus menggunakan sejumlah perbandingan yang ada dalam aditif dari penyortiran. Bagus. Ngomong-ngomong, partisi rantai dapat ditemukan dalam waktu polinomial dari serangkaian perbandingan yang telah dilakukan, daripada membutuhkan pencarian kasar, tetapi itu tidak membuat perbedaan untuk argumen Anda. O(nloglogn)
David Eppstein
6
Bukti benar-benar menunjukkan bahwa Anda harus memiliki baik preprocessing atau Ω ( n ) untuk setiap query. Tentu saja keduanya ketat. Ini menunjukkan bahwa pencarian biner dan pencarian linear adalah satu-satunya algoritma pencarian "menarik" (setidaknya di dunia klasik). Ω(nlogn)Ω(n)
Yuval Filmus
1
@Yuval: mungkin Anda harus menuliskan pengamatan ini sebagai jawaban yang sebenarnya, karena menurut saya Anda harus melakukan pekerjaan yang moderat untuk mendapatkan hasil di atas dari bukti dalam jawaban.
Peter Shor
1
@Yuval: memikirkan buktinya, saya hanya melihat bahwa Anda harus memiliki preprocessing atau Ω ( n 1 - ϵ ) waktu permintaan untuk semua ϵ . Ini mungkin untuk memiliki o ( n log n ) preprocessing waktu dan O ( n / log n ) waktu query. Satu dapat membagi daftar menjadi log n daftar ukuran n / log n masing-masing dalam waktu θ ( nΩ(nlogn)Ω(n1ϵ)ϵo(nlogn)O(n/logn)lognn/logn menggunakan penemuan median berulang. θ(nloglogn)
Peter Shor
0

Seperti yang dicatat oleh Peter Shor, untuk mengesampingkan keanggotaan dalam model berbasis perbandingan, kita perlu tahu bagaimana elemen tersebut dibandingkan dengan setiap anggota. Jadi, dengan menggunakan kueri acak (jumlah anggota lebih kecil dari kueri nonanggota adalah acak), kita memperoleh informasi Θ ( n log k ) relatif memiliki n nilai yang tidak disortir. Oleh karena itu, untuk beberapa konstanta c > 0 , menggunakan ck<nΘ(nlogk)nc>0 preprocesssing, kita tidak bisa memilikiccnlogk permintaan biaya. Ini optimal hingga faktor konstan karena kita dapat mengurutkan data menjadi k = k / log k n / log n kira-kira sama ember (setiap ember tidak disortir) dalam O ( n log k ) = O ( n log k ) waktu, yang memungkinkan O ( n / k ) biaya permintaan.cnlogk/kk=k/logkn/lognO(nlogk)=O(nlogk)O(n/k)

Secara khusus, menggunakan preprocessing, kami tidak dapat memiliki o ( n ) biaya permintaan. Juga, o ( n log n ) preprocessing sesuai dengan k di O ( n ε ) untuk setiap ε > 0 dan dengan demikian Ω ( n 1 - ε ) biaya permintaan.O(n)o(n)o(nlogn)kO(nε)ε>0Ω(n1ε)

Dmytro Taranovsky
sumber