Bir dizide iki yığın nasıl uygulanır?


15

Bunun bir ödev sorusu olmadığını söyleyerek başlamak istiyorum. Daha iyi bir programcı olmak için ünlü CLRS metni olan Algoritmalara Giriş'i okuyorum. Kitapta verilen problemleri ve alıştırmaları kendim çözmeye çalışıyorum.

Ben çözmeye çalışıyorum treynerlerin 10.1-2 dan Bölüm 10 İlköğretim Veri Yapıları CLRS Second Edition dan. Durumları:

Bir dizi A [1..n] 'da iki yığının, her iki yığındaki toplam eleman sayısı birlikte n olmadığı sürece hiçbir yığının taşmayacağı şekilde açıklanacaktır . PUSH ve POP işlemleri O (1) zamanda yapılmalıdır .

Şimdiye kadar bulduğum çözüm:

A [1..n] dizisinin iki yığın uygulamasına izin verin : S1 [1..i] ve S2 [i..n] .

İçin PUSH-S1 ve PUSH-S2 yığını 'tam' ise operasyonların ardından içine elemanları iterek başlamak diğer (yığının örneğin. Yığını halinde S1 yeni eleman daha sonra içine eleman itin içinde itilebilir çalıştığında dolu yığın S2 ve tersi).

Bu yaklaşımla ilgili sorun, hangi öğenin hangi yığına ait olduğunu hatırlamanın bir yolu olmadığından POP-S1 veya POP-S2'yi güvenilir bir şekilde yapamayacağım . Yığın öğeleri (anahtar, değer) çiftleri ise, anahtar yığın numarasıdır, daha sonra en kötü durumda, i veya (ni) kez aramam gereken bir öğeyi açmak için - O (n) ) (burada yanılıyorsam beni düzeltmekten çekinmeyin), ki bu O (1) olmaz .

Bir süredir soruya kafamı sokuyorum. Ben doğru yolda mıyım? Birisi bu sorunu çözmek için olası işaretçilerimi verebilir mi?

Genel olarak, bu problemleri nasıl 'düşünmeliyim'? Yoksa bu tür sorunları sadece gerçekten zeki insanlar çözebilir mi? Bu gibi problemlerle mücadele etmek / çözmek (yani deneyim kazanmak) bu konuda daha iyi olmamı sağlayacak mı?

Aydınlanmayı bekliyorum.


3
"Böyle problemlerle mücadele etmek / çözmek (yani deneyim kazanmak) bu konuda daha iyi olmamı sağlayacak mı?" Deneyimlerime göre, bu kesinlikle böyledir. Başka bir şey yoksa, sorun hakkında birçok şekilde düşünmüş olacaksınız ve bununla birlikte daha fazla içgörü geliştireceksiniz. Son zamanlarda söylediğim gibi: iyi fikirlere sahip olmanın en iyi yolu birçok fikre sahip olmaktır.
G. Bach

Yanıtlar:


7

Yuval'ın söylediklerine ek olarak başka bir ipucu: yığınları dizilere belirli bir şekilde yerleştirmeye ve buna göre büyüme yönlerini sabitlemeye yardımcı olur . Aynı yönde büyümeleri gerekmez.


5

İşte bazı ipuçları:

  1. Yığınlardan biri "yukarı" ve diğeri "aşağı" büyümelidir.
  2. Hangi öğenin hangi yığına ait olduğunu 'hatırlamanın' bir yolu yoktur - böyle şeyler konusunda size yardımcı olması için ek değişkenler kullanmanıza izin verilir. (Bu, ilk ipucunun önerdiği çözümle daha anlamlı.)

1

İlk yığın 1'den başlar ve n'ye doğru büyürken ikinci form n'den başlar ve 1'e doğru büyür. İki yığın işaretçisi bitişik olduğunda bir öğe itildiğinde yığın taşması gerçekleşir.


1

Bu yöntem kullanılabilir alanı verimli bir şekilde kullanır. Eğer arr [] içinde kullanılabilir alan varsa taşmaya neden olmaz. Fikir arr [] iki aşırı köşesinden iki yığın başlatmaktır. yığın1 en soldaki öğeden başlar, yığın1'deki ilk öğe 0 dizininde itilir. Yığın2 en sağ köşeden başlar, yığın2'deki ilk öğe dizinde (n-1) itilir. Her iki yığın da ters yönde büyür (veya küçülür). Taşmayı kontrol etmek için kontrol etmemiz gereken tek şey, her iki yığının üst elemanları arasında boşluk bulunmasıdır.


-1

Başka bir çözüm düşündüm. Diziyi yarıya bölersek (veya dizi tek uzunlukta ise mümkün olduğunca yakınsa) ve ilk öğenin ilk yığına ve ikinci öğenin ikinci yığına girmesini sağlarsak. Haşhaşlarken bu adımları izleyebiliriz. Ancak, bu şekilde uygulayarak herhangi bir yığın ilkesini ihlal eder mi?


Bilgisayar Bilimine Hoşgeldiniz ! Maalesef teklifiniz çalışmıyor. Bir uzunluk dizisindeN-, toplam boyutları N'yi aşmadığı sürece taşmayacak iki yığını depolayabilmeniz gerekir (bu nedenle boş bir yığın ve bir uzunluk yığını ile baş edebilmelidir.N-). Yığınlardan biri aşılırsa çözümünüz taşarN-/2.
David Richerby

-2

Bazı ipuçları

Dizi yap

Tek dizinli dizi öğeleri yığın1 içindir

Çift dizinli dizi öğeleri stack2 içindir

Artık her iki yığını da soldan sağa doğru büyütebilirsiniz

Her iki yığının en üst konumunu koruyan değişkenleri tutmanız yeterlidir. Diziyi aramak zorunda kalmayacaksınız.

ve stack2 boşken stack1 dolarsa, bazı değişkenleri koruyarak stack2'deki ek stack1 öğelerinin kaydını tutabilirsiniz


Bu çok kıvrımlı. Mevcut cevaplar zaten problemi çözmek için çok daha basit yollar sunuyor
David Richerby
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.