Tumpukan yang dapat dipisah


22

Apa yang diketahui tentang struktur data yang dapat mempertahankan urutan item yang tunduk pada dua operasi berikut?

  • Tekan (x): tambahkan x ke akhir urutan, dan kembalikan pengidentifikasi untuk posisinya di urutan
  • Ekstrak (S): diberi seperangkat pengidentifikasi yang tidak berurutan, menghapus item di posisi tersebut dari urutan, dan mengembalikan daftar item yang dihapus dalam urutan urutan

Jika Anda suka, Anda bisa menganggap ini sebagai tumpukan atau antrian dengan operasi split yang membaginya menjadi dua tumpukan: operasi ekstrak dapat digunakan untuk menerapkan operasi pop atau dequeue, dan urutan item yang diekstraksi juga dapat diletakkan kembali lagi ke tumpukan atau antrian yang berbeda.

Apa yang sudah saya ketahui: seseorang dapat mempertahankan urutan sebagai daftar yang ditautkan dua kali lipat, di mana setiap pengenal hanyalah sebuah penunjuk ke simpul daftar-tertaut, dan setiap simpul juga menyimpan nomor posisi yang memungkinkan perbandingan cepat antara posisi dua elemen yang tidak terkait dalam urutan. Tidak sulit untuk memperbarui nomor posisi saat struktur data berkembang sehingga semuanya adalah bilangan bulat positif dari nilai maksimum , di mana adalah jumlah item saat ini dalam daftar. Dengan struktur data ini, satu-satunya bagian yang sulit dari operasi ekstrak adalah menyortir item yang diekstraksi berdasarkan nomor posisi mereka. Ekstraksi item membutuhkann k O ( k O(n)nkO(kloglogk) waktu acak yang diharapkan menggunakan algoritma pengurutan integer dari Han dan Thorup dari FOCS 2002, misalnya, dan operasi push membutuhkan waktu yang konstan.

Apa yang saya tidak tahu: apakah mungkin untuk menangani ekstrak dalam waktu dan mendorong dalam waktu yang konstan? Apakah ada literatur tentang masalah ini? Apakah sulit seperti penyortiran bilangan bulat?O(k)

Motivasi: ini adalah langkah dasar yang diperlukan untuk memesan item dalam algoritma penjadwalan Coffman-Graham, yang juga memiliki aplikasi dalam menggambar grafik. Bagian sulit dari Coffman-Graham adalah pemesanan topologi leksikografis. Hal ini dapat dilakukan dengan mempertahankan, untuk masing-masing indegree yang berbeda, urutan simpul dengan indegree dalam subgraph yang disebabkan oleh simpul yang tersisa. Kemudian, berulang-ulang hapus simpul pertama dari urutan simpul nol-nol dan tambahkan ke urutan topologi; ekstrak tetangga dari derajat yang sebelumnya milik mereka dan dorong mereka ke urutan untuk derajat yang lebih kecil berikutnya. Jadiv O ( k )vvO(k) waktu untuk operasi ekstrak dalam struktur data ini akan mengarah pada implementasi waktu linear dari algoritma Coffman-Graham.

Sejak awalnya menanyakan hal ini, saya menemukan sebuah makalah oleh Sethi dari tahun 1976 yang memungkinkan algoritma Coffman-Graham diimplementasikan dalam waktu linier, dan memasukkannya dalam artikel Wikipedia saya pada algoritma Coffman-Graham , sehingga motivasi aslinya kurang bermakna. Saya masih penasaran apa jawabannya.


Jika penyisipan hanya terjadi di akhir urutan, Anda dapat mempertahankan daftar ditautkan ganda dan tabel hash dari posisi item. Penyisipan: diamortisasi O (1) (hanya menyimpan pointer ke item terakhir). Ekstraksi k item: amortisasi O (k) (untuk setiap elemen S, dapatkan pointer dan hapus dari tabel hash, dapatkan dan hapus item dari daftar dan tambahkan ke hasil ekstraksi).
Marzio De Biasi

3
Ini bukan ekstraksi item dari daftar yang membutuhkan waktu, itu mengatur ulang mereka dari urutan argumen yang tidak disortir untuk Mengekstrak ke dalam urutan urutan yang benar.
David Eppstein

Jawaban:


1

Saya pikir ini setidaknya sama sulitnya dengan menyortir satu set bilangan bulat dengan "saran acak" dari ukuran polinomial dalam . Dengan saran acak saya maksudkan bahwa untuk setiap ada distribusi tetap ( hanya bergantung pada ) lebih dari string ukuran poli ( ) dan algoritma kami (dimodelkan oleh mesin RAM) diberi akses acak ke satu sampel dari . adalah struktur data (acak) setelah mendorong secara berurutan, bersama dengan tabel hash yang memetakan integer ke pengidentifikasi dalam waktu .n n D n n n D n D n [ n ] O ( 1 )S[n]nnDnnnDnDn[n]O(1)

Mengingat pengaturan itu, misalnya dari masalah penyortiran bilangan bulat, kita dapat mengeluarkan ekstrak ( ) (sebenarnya kita membutuhkan pengidentifikasi tetapi pemetaan ini dapat dilakukan dalam waktu per item menggunakan tabel hash yang merupakan bagian dari saran) dan input akan diurutkan dalam waktu yang diperlukan untuk menjalankan ekstrak.S S O ( 1 )S[n]SSO(1)

Jadi, pesannya adalah bahwa, kecuali beberapa informasi sisi "bebas" yang hanya bergantung pada batas atas dari bilangan bulat dapat membuat penyortiran bilangan bulat lebih mudah, ekstrak sekeras penyortiran bilangan bulat.

Apakah ini menyiratkan hubungan antara dua masalah tanpa model aneh? Apakah gagasan nasehat acak ini diketahui? Ini semacam protokol MA, tetapi pesan Merlin tidak diperbolehkan bergantung pada input dan kami peduli dengan waktu berjalan Arthur.


[n]DnΩ(n)DnΩ(n)k[n]O(n+k)O(k)
Dave

Anda memiliki perhitungan yang diberikan secara gratis, namun akses tidak gratis: setiap kueri dibebankan sebagai langkah waktu. Bisakah Anda mendesain sehingga Anda bisa mengurutkan bilangan bulat dengan kueri ke string yang diambil dari ? D n k O ( k ) D nΩ(n)DnkO(k)Dn
Sasho Nikolov

Inilah alasan mengapa saya tidak menemukan jawaban ini sepenuhnya meyakinkan. Jika Anda hanya memiliki satu set S bilangan bulat yang ingin Anda urutkan, semuanya adalah waktu linier (lakukan saja penghitungan urut dalam O (n + k)). Tetapi jika Anda mencoba menggunakan struktur data ini untuk mensimulasikan urutan banyak jenis kecil (sehingga jenis penghitungan tidak cukup baik) maka hanya yang pertama dari jenis kecil ini benar-benar tidak dibatasi: setelah itu, Anda telah menghapus beberapa dari elemen [n], jadi setiap urutan yang Anda sortir harus dipisahkan dari yang sebelumnya. Jadi sepertinya sulit untuk membuat pengurangan dari pekerjaan menyortir.
David Eppstein

@ David Eppstein: untuk macam Anda dapat mengambil salinan struktur data awal. Tentu saja, model "saran acak" yang aneh tidak sepenuhnya meyakinkan, kami ingin pengurangan dalam arti biasa. Tetapi pesan yang saya sampaikan adalah bahwa waktu permintaan menyiratkan bahwa algoritma pengurutan bilangan bulat dapat memanfaatkan saran yang independen dari inputnya dengan cara yang efisien-akses memori. Ini berlawanan dengan intuisi saya, tetapi intuisi saya lemah di sini. BTW, saya pikir bukan jenis waktu linear yang Anda senangi? O ( k )O(k)O(n+k)
Sasho Nikolov

Jika Anda menyalin struktur data satu kali untuk setiap penggunaan, Anda menggunakan waktu untuk membuat salinan untuk setiap jenis, jadi ini tidak menghasilkan penyortiran yang lebih cepat. Jika Anda hanya menanyakan posisi dalam string yang mewakili seperti yang Anda sarankan, tidak jelas apakah ini cukup untuk mengurutkan waktu . Struktur data dapat berubah selama operasi ekstrak, dan berjalan pada versi statis dapat meningkatkan runtime. D n O ( k )Ω(n)DnO(k)
Dave
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.