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.
sumber
Jawaban:
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.
sumber
Berikut ini beberapa petunjuk:
sumber
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.
sumber
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.
sumber
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?
sumber
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
sumber