Kümeler ve ikili arama ağacı kullanarak Ayrıştırma ve bina S-İfadeler

oy
1

Bu sözde ödev (ekstra kredi var) 'dir. Ben sözcükleri içeren (başka bir yerde saklanan) hatlarına işaret kelimelerin bir indeks olan bir BST var. (|) I birleştirmek ve (&) ve ya böylece ben s-ifadeler kullanarak aramak için bir yol uygulamak gerekir.

Komutanım gibi bir şey yazabilirsiniz bir kullanıcı istemi:

QUERY ((((fire)&(forest))|((ocean)&(boat)))&(water))

Esasen bu kelimeler yangın, orman ve su yanı sıra okyanus, tekne ve su içeren tüm satırları içeren tüm satırları dönmelidir.

Ya gerçekten yardıma ihtiyacı düzgün gerçek kodundan daha ifadesini temsil etmek ağaca ayrıştırma ve yerleştirme düğümleri için mantıktır. Beni ifadesinde her kelime için bir dizi çizgi dönen ben dışarı çalışmış tek şey mantıklı. bir veya veya ve operasyonu yeni bir kümesi oluşturmak ve ağacın yukarı o aktarmak bu setlerinde bir birlik veya kavşak tipi işlemi gerçekleştirmek istiyorum eğer Sonra bağlı.

Ben tür ifadesini içeren satırı ayrıştırmak için nasıl kayboldum. bazıları alt ifadelerin biri üzerinden uzak benim s-ifadesi ağacında olmalıdır yüksek olduğunu görünür düşündükten sonra? Sadece bildiğim kadarıyla ayrıştırma olarak doğru yönde bir itme alabilir ve ağaçta ifadeleri ekleme tamam olması gerekiyorsa sanırım.

Ben sorgu yukarıdaki gibi görünür için geldi Benim örnek ağaç;

                                            &
                                         /     \
                                       |       water
                                   /      \
                                 &          &
                               /   \        /   \
                            fire  forest  ocean boat

Bu yangın Bütün ormanı ihtiva çizgilerin bir dizi dönecekti yangın ve orman ihtiva çizgilerin bir dizi dönecekti olarak mantıklı. O zaman en & seviye O iki set almak ve böylece bana sadece yangın ve orman her ikisini de içerir hattına sahip bir dizi vererek her iki takımdaki vardı sadece çizgileri içeriyordu başka bir set oluşturacak.

Benim diğer engel ben ayrıştırma engel aşmak sonra ağaçta şeyi temsil etmek nasıl. Benim ExpTree (BST) için düğümlerin olarak görev yapacak bir ExpTreeNode sınıf var ve sonra 2 alt sınıfları, operatör ve işlenen var, ama bu iyi bir yaklaşım olup olmadığından emin değilim.

Oluştur 13/04/2011 saat 18:11
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
4

Dijkstra zaten sizin için bunu yaptı :-)

: Manevra bahçesinde algoritma deneyin http://en.wikipedia.org/wiki/Shunting-yard_algorithm

Sen şant yarda algoritması kullanılarak RPN (cila gösterimi ters) oluşturabilir ve bu oluşturulduktan sonra bu ikili ağaç oluşturmak için içinden, bir geçiş yapabilirsiniz.

Normalde, RPN değerlendirme yapmak için kullanılır, ama aslında bir ağacı oluşturabilirsiniz.

Örneğin, yerine değerlendirilmesinin, ağaç düğümleri oluşturmak ve yığın üzerine bunları itin.

Yani, Düğüm1, Düğüm2 operatörü görürseniz. Yeni bir düğüm oluşturmak

   Operator
   /     \
  node1   node2

ve yığına geri itin.

Daha detaylı bir örnek:

ifadesidir ki (apples AND oranges) OR kiwis

Bunun için RPN olduğunu kiwis oranges apples AND OR

Bir yığın korurken Şimdi bu yürüyün.

kivi üzerinden bir düğüm yığını üzerine itin. portakal dışarı düğüm istifi üzerine itin. elma ile aynı.

Yani yığını

Node:Apples
Node:Oranges
Node:Kiwis

Şimdi görüyor VE makinasıdır.RPN içinde.

Sen yığınından üst iki pop ve AND ebeveyn olarak yeni bir Düğümü oluşturun.

Düğüm: AND, [Düğüm: Elma, Düğüm: Portakallar]

temelde ağaç

       AND
     /    \
  Apples  Oranges

Şimdi yığını üzerine bu düğüm itin.

Yani yığını

Node:AND, [Node:Apples, Node:Oranges]
Node:Kiwis

ağaç alma çocuk olarak Düğüm Kiwis ANd ve: Şimdi görüyor VEYA makinasıdır.RPN ve birlikte VEYA ebeveyn ve Düğüm gibi bir düğüm oluşturmak

           OR 
         /   \
       AND   Kiwis
     /    \
  Apples  Oranges

Hatta ağaç oluşturmak için manevra bahçesinde algoritmasını değiştirmek mümkün, ama makinasıdır.RPN ile ilgili daha kolay görünüyor olabilir.

Alternatif olarak, Recursive Descent Ayrıştırma teknikleri kullanmayı deneyebilirsiniz. Ne sormak çok yaygındır ve web'de arama yaparsanız, hatta dilbilgisi ve kodu bulmak mümkün olacak.

Bu arada, sadece İkili ağaç hakkını mı? BST (İkili Arama Ağacı) ekstra bir kısıtlaması vardır ...

Cevap 13/04/2011 saat 18:14
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more