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.