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 ) ?
Saya benar-benar berpikir tidak ada, jadi bukti bahwa tidak ada juga disambut.
ds.data-structures
sorting
Chi-Lan
sumber
sumber
Jawaban:
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.Sebuah b Sebuah b
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 / logn n/ logn O ( logn ) O ( n loglogn )
sumber
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 ) .A O(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)
sumber
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) n c>0 preprocesssing, kita tidak bisa memiliki ≤ ccnlogk 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/k k′=k/logk≤n/logn O(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) k O(nε) ε>0 Ω(n1−ε)
sumber