Pertanyaan ini terinspirasi oleh pertanyaan yang ada tentang apakah stack dapat disimulasikan menggunakan dua antrian dalam waktu diamortisasi per operasi stack. Jawabannya sepertinya tidak diketahui. Berikut adalah pertanyaan yang lebih spesifik, terkait dengan kasus khusus di mana semua operasi PUSH dilakukan terlebih dahulu, diikuti oleh semua operasi POP. Seberapa efisien daftar elemen dapat dibalik menggunakan dua antrian yang awalnya kosong? Operasi hukum adalah:N
- Enqueue elemen berikutnya dari daftar input (ke ujung salah satu antrian).
- Dequeue elemen di kepala antrian baik dan enqueue lagi (ke ekor antrian baik).
- Dequeue elemen di kepala salah satu antrian dan tambahkan ke daftar output.
Jika daftar input terdiri dari elemen , bagaimana jumlah minimum operasi yang diperlukan untuk menghasilkan daftar output terbalik berperilaku? Sebuah bukti bahwa itu tumbuh lebih cepat daripada akan sangat menarik, karena itu akan menyelesaikan pertanyaan aslinya dalam negatif.[ N , N - 1 , . . . , 2 , 1 ] O ( N )
Pembaruan (15 Jan 2011): Masalahnya dapat diselesaikan di , seperti yang ditunjukkan dalam jawaban yang diajukan dan komentar mereka; dan batas bawah sepele. Bisakah salah satu dari batasan ini diperbaiki?Ω ( N )
Jawaban:
Jika N adalah kekuatan dua, saya percaya operasi O (N log N) sudah cukup, bahkan untuk masalah yang agak lebih terbatas di mana semua item dimulai pada salah satu antrian dan harus berakhir dalam urutan terbalik pada salah satu antrian (tanpa daftar input dan output).
Dalam langkah-langkah O (N) dimungkinkan untuk memulai dengan semua elemen pada satu antrian, bermain "satu untukmu satu untukku" untuk membaginya menjadi subset bergantian pada antrian lainnya, dan kemudian menggabungkan semuanya kembali menjadi satu antrian. Dalam hal representasi biner dari posisi item, ini mengimplementasikan operasi rotasi.
Dalam langkah-langkah O (N) juga dimungkinkan untuk menarik pasangan elemen dari satu antrian, menukar mereka, lalu memasangnya kembali, membalikkan semua pasangan. Dalam hal representasi biner dari posisi item, ini melengkapi bit order posisi rendah.
Dengan mengulangi O (log N) kali unshuffle dan swap berpasangan, kita dapat melengkapi semua bit dari representasi biner dari posisi - yang sama dengan membalikkan daftar.
sumber
Beri nama dua antrian yang tersedia sebagai kiri dan kanan. Berikut adalah ide dasar dari algoritma ini dengan asumsi bahwa N adalah genap:
Sangat mudah untuk melihat bagaimana algoritma seharusnya bekerja untuk N. aneh
sumber