SORU
13 NİSAN 2009, PAZARTESİ


Nasıl olursa ikili ağaç dengeli olup olmadığını belirlemek için?

Bu okul yıllarından itibaren bir süre oldu. BUNUN gibi bir işi bir hastanede uzman var. Taşımak için çalışıyor şimdi bazı gerçek programlama yapmak. İkili ağaçlar üzerinde çalışıyorum, ve eğer ağaç yüksekliği dengeli olup olmadığını belirlemek için en iyi yolu ne olacağını merak ediyordum.

Bir şeyle birlikte ben şöyle bir şey düşündüm:

public boolean isBalanced(Node root){
    if(root==null){
        return true;  //tree is empty
    }
    else{
        int lh = root.left.height();
        int rh = root.right.height();
        if(lh - rh > 1 || rh - lh > 1){
            return false;
        }
    }
    return true;
}

Bu iyi bir uygulama mı? ya da ben bir şey eksik?

CEVAP
1 ŞUBAT 2010, PAZARTESİ


Başka bir şey ararken bu çok eski bir soruya rastladım. Hiç tam bir cevap aldın fark ettim.

Bu sorunu çözmek için bir yol yazmak istediğiniz işlev için bir şartname yazarak başlamaktır.

Özellikler: Bir iyi biçimlendirilmiş ikili ağaç olduğunu söyledi "yükseklik-dengeli" (1) boş, ya da (2) sol ve sağ çocuk boy-dengeli ve yüksekliği sol ağaçtır içinde 1 yüksekliği hakkı ağacı.

Belirtimi varsa, şimdi kod yazmak için önemsiz. Sadece belirtimi izleyin:

IsHeightBalanced(tree)
    return (tree is empty) or 
           (IsHeightBalanced(tree.left) and
            IsHeightBalanced(tree.right) and
            abs(Height(tree.left) - Height(tree.right)) <= 1)

Seçtiğiniz programlama diline tercüme önemsiz olmalıdır.

Bonus egzersiz: ağaç far yüksekliklerini hesaplarken bir çok kez. bu kadar saf kod kroki erişir Daha verimli hale getirebilir mi?

Süper bonus egzersiz: ağaç sanırımkitleseldengesiz. Bir milyon kadar derin, diğer tarafta bir tarafta ve üç derin düğümler. Bu darbeler algoritma bir yığın senaryo var mı? Hiç darbeler böylece uygulama düzeltme ağır dengesiz bir ağaç verildiğinde, hatta yığını mı?

GÜNCELLEME: Donal Arkadaşlar 'dengeli' bir seçim olabilir. farklı tanımları vardır bu cevabı puan Örneğin, bir daha katı bir tanım alabilir "height dengeli" ve gerektiren yol uzunluğu olduğu içinyakınboş çocuk için yolun bir oteldiren uzakboş çocuk. Benim tanımım daha az sıkı olduğunu, ve bu nedenle daha fazla ağaç itiraf ediyor.

Bir de daha az kesin daha benim tanımı; biri diyebiliriz dengeli bir ağaçtır biri olan yol uzunluğu için boş bir ağaç üzerinde her şube farklı tarafından en fazla iki veya üç, veya başka bir sabit. Veya en fazla yol uzunluğu yol uzunluğu, yarım veya dörtte bir gibi bir parçası.

Gerçekten genellikle bir önemi yok. Herhangi bir ağaç dengeleme algoritması noktası bir tarafta bir milyon düğümleri ve diğer üç olduğu durumda rüzgar emin olmak için. Donal tanımı teoride iyi, ama pratikte bir ağrı katılık düzeyini karşılayan ağaç-dengeleme algoritması ile geliyor. Performans tasarruf genellikle uygulama maliyeti haklı çıkarmaz. Pratikte çok az fark yapar bu denge düzeyine ulaşmak için çok zaman gereksiz ağaç yeniden düzenlenmesi harcıyorsun. Eğer kırk dallarında teori son derece dengeli bir ağaç yalnızca yirmi sürebilir zaman milyon düğümlü bir eksik dengeli bir ağacın en uzak yaprağı alır bazen kimin umurunda? Bu nokta şimdiye kadar bir milyon sürmüyor. Kırk bir en kötü durum için bir milyon kötü bir durumda aşağı almak genellikle yeterli olur; en iyi durumda tüm yol gitmek zorunda değilsin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EvilControllers

    EvilControll

    20 Ocak 2008
  • Kap Slap

    Kap Slap

    8 Mart 2010
  • Schmittastic Jr.

    Schmittastic

    19 Mart 2013