2012-07-04 18 views
7

Geniş matematiksel ifadelere (milyonlarca düğüm) karşılık gelen ifade grafikleri için ortak alt-ifade eleme (CSE) uygulamak için arıyorum.Ortak alt ifade eliminasyonu gerçekleştirme

Bunu yapmak için hangi algoritmalar uygundur? Kullanımı kolay bir algoritma için interneti araştırıyordum ama hiçbir şey bulamadım. Mümkünse, algoritma tam ifade grafiğinin düğüm sayısında doğrusal bir karmaşıklığa sahip olmalıdır.

+0

Bu sunum size yardımcı olabilir: http://www.masonchang.com/blog/2010/8/9/sea-of-nodes-compilation-approach.html –

cevap

9

Bunlar yan etki içermeyen ifadelerdir. Sonra yapılacak en kolay şey, alt ifadenin ortadan kaldırılması için adayları belirlemek için her alt ifadenin ağaçlarını kovalara ayırmaktır. Bu, tüm ifadelerin tek bir (büyük) "temel blokta" bulunduğu CSE özel bir durumudur. (Bu fikri duplicate code algılamak için temel olarak kullanıyorum.)

İfadelerin sıralı ve yan etkileri varsa, Value Numbering'u düşünebilirsiniz.

+0

Doğru, hiçbir yan etkisi yoktur. Önerinizi doğru bir şekilde anladığım takdirde, bağımlılık sırasına göre ifadenin düğümleri üzerinde döngü yapmalı ve her adımda bir özet haritasının bir karma haritada bulunup bulunmadığını kontrol etmeliyim. Varsa, o zaman karma haritasına eklemezseniz, bu alt ifadeyi kullanın. Bu doğru anlaşıldı mı? – Joel

+0

Yep. "Bağımlılık sırasına göre", her ağaç için aşağıya doğru anlamına gelir. –

+0

Aslında bu stratejiyi düşünüyordum. Ne tür bir karmaşayı kullanırdınız? – Joel