Bagaimana menerapkan dua tumpukan dalam satu array?

15

Saya ingin memulai dengan mengatakan bahwa ini BUKAN pertanyaan pekerjaan rumah. Saya membaca Pengantar Algoritma - teks CLRS yang terkenal untuk menjadi programmer yang lebih baik. Saya mencoba untuk menyelesaikan masalah dan latihan yang diberikan dalam buku sendiri.

Saya mencoba untuk menyelesaikan Latihan 10.1-2 dari Bab 10 Struktur Data Dasar dari CLRS Edisi Kedua. Inilah yang dinyatakan:

Jelaskan bagaimana menerapkan dua tumpukan dalam satu array A [1..n] sedemikian rupa sehingga tidak ada tumpukan yang meluap kecuali jumlah total elemen dalam kedua tumpukan bersama adalah n . Operasi PUSH dan POP harus berjalan dalam O (1) waktu.

Solusi yang saya buat sejauh ini adalah:

Biarkan array A [1..n] mengimplementasikan dua tumpukan: S1 [1..i] dan S2 [i..n] .

Untuk operasi PUSH-S1 dan PUSH-S2 , jika stack 'penuh' maka mulailah mendorong elemen ke stack lain (mis. Jika stack S1 penuh ketika elemen baru mencoba untuk didorong masuk, kemudian dorong elemen itu ke dalam tumpukan S2 dan sebaliknya).

Masalah dengan pendekatan ini adalah saya tidak akan bisa POP-S1 atau POP-S2 andal karena tidak ada cara 'mengingat' elemen mana yang termasuk stack. Jika elemen-elemen stack adalah (kunci, nilai) pasangan, kuncinya adalah nomor stack, maka untuk memunculkan elemen saya harus mencari, dalam kasus terburuk, i atau (ni) kali - yang akan menjadi O (n ) (jangan ragu untuk mengoreksi saya jika saya salah di sini), yang tidak akan menjadi O (1) .

Saya telah membenturkan kepala saya pada pertanyaan untuk beberapa waktu sekarang. Apakah saya di jalur yang benar? Adakah yang bisa memberikan petunjuk saya untuk menyelesaikan masalah ini?

Secara umum, bagaimana saya harus 'memikirkan' masalah ini? Atau bisakah hanya orang yang benar-benar pintar memecahkan masalah seperti ini? Akankah mengatasi / memecahkan masalah seperti ini (yaitu mendapatkan pengalaman) membantu saya menjadi lebih baik dalam hal ini?

Saya menunggu pencerahan.

Suyash Gupta
sumber
3
"Akankah mengatasi / memecahkan masalah seperti ini (yaitu mendapatkan pengalaman) membantu saya menjadi lebih baik dalam hal ini?" Dalam pengalaman saya, ini jelas terjadi. Jika tidak ada yang lain, Anda akan berpikir dalam berbagai cara tentang masalah, dan dengan itu saja mengembangkan lebih banyak wawasan. Seperti yang baru-baru ini saya diberitahu: cara terbaik untuk memiliki ide-ide bagus adalah memiliki banyak ide.
G. Bach

Jawaban:

7

Petunjuk lain di samping apa yang dikatakan Yuval: membantu menempatkan tumpukan dengan cara tertentu di dalam susunan dan memperbaiki arah pertumbuhannya. Mereka tidak harus tumbuh ke arah yang sama.

G. Bach
sumber
5

Berikut ini beberapa petunjuk:

  1. Salah satu tumpukan harus tumbuh "naik" dan yang lain "turun".
  2. Tidak ada cara 'mengingat' elemen mana yang termasuk tumpukan - Anda diizinkan menggunakan variabel tambahan untuk membantu Anda dengan hal-hal seperti itu. (Ini lebih masuk akal dengan solusi yang diusulkan oleh petunjuk pertama.)
Yuval Filmus
sumber
1

Tumpukan pertama dimulai pada 1 dan tumbuh ke arah n, sedangkan tumpukan kedua mulai dari n dan tumbuh ke bawah ke arah 1. Stack overflow terjadi ketika sebuah elemen didorong ketika dua pointer stack berdekatan.

Pankaj Moolrajani
sumber
1

Metode ini secara efisien memanfaatkan ruang yang tersedia. Itu tidak menyebabkan overflow jika ada ruang yang tersedia di arr []. Idenya adalah untuk memulai dua tumpukan dari dua sudut ekstrem []. stack1 dimulai dari elemen paling kiri, elemen pertama di stack1 didorong pada indeks 0. stack2 dimulai dari sudut paling kanan, elemen pertama di stack2 didorong pada indeks (n-1). Kedua tumpukan tumbuh (atau menyusut) ke arah yang berlawanan. Untuk memeriksa overflow, yang perlu kita periksa adalah ruang antara elemen atas dari kedua tumpukan.

MONU KUMAR
sumber
-1

Saya memikirkan solusi lain. Jika kita membagi array menjadi setengah (atau sedekat mungkin jika array memiliki panjang ganjil) dan membuat elemen pertama masuk ke tumpukan pertama dan elemen kedua masuk ke tumpukan kedua. Sambil bermunculan kita bisa menelusuri kembali langkah-langkah ini. Namun, dengan menerapkan cara ini, apakah akan melanggar prinsip tumpukan?

MindBrain
sumber
Selamat Datang di Ilmu Komputer ! Sayangnya, proposal Anda tidak berfungsi. Dalam array panjangN, Anda seharusnya dapat menyimpan dua tumpukan yang tidak akan meluap kecuali ukuran totalnya melebihi N (jadi itu harus dapat mengatasi tumpukan kosong dan tumpukan panjangN). Solusi Anda meluap jika salah satu tumpukan melebihiN/2.
David Richerby
-2

Beberapa petunjuk

Buat sebuah array

Elemen array dengan indeks ganjil adalah untuk stack1

Elemen array dengan indeks genap adalah untuk stack2

Sekarang Anda dapat menumbuhkan kedua tumpukan dari kiri ke kanan

Terus variabel yang mempertahankan posisi teratas dari kedua tumpukan. Anda tidak perlu mencari array.

dan jika stack1 menjadi penuh saat stack2 kosong Anda dapat melacak elemen stack1 tambahan di stack2 dengan mempertahankan beberapa variabel

pengguna4129542
sumber
Ini sangat berbelit-belit. Jawaban yang ada sudah memberikan cara yang lebih sederhana untuk menyelesaikan masalah
David Richerby