2008-10-17 11 views
8

Viral veya kısıtlayıcı bir lisans olmaksızın verimli bir C++ aralık ağacı uygulaması (büyük olasılıkla kırmızı siyah ağaçlara dayalı) bulmaya çalışıyorum. Temiz, hafif, bağımsız bir uygulama için herhangi bir işaretçi? Akılda tuttuğum kullanım durumu için, aralıkların kümesi başlangıçta bilinir (bir milyon diyebilir) ve belirli bir aralığın üstüste binen aralıkların listesini hızlıca elde edebilmek istiyorum. Böylece bir zamanlar inşa edilen ağaç değişmeyecek - sadece hızlı sorgulara ihtiyaç duyuyor.C++ aralık ağacı algoritması uygulamasının bulunması

cevap

3

C++ standart kitaplık kırmızı/siyah ağaçları std::map, std::multimap, std::set ve std::multiset sunar.

Gerçekten, yineleyici çiftleri std::map tutmak ve upper_bound() ve lower_bound() için bu yineleyici çiftleri geçirmeden daha etkili bu işlemek için herhangi bir şekilde düşünemiyorum. Yineleyici çiftlerinin bir haritanın içinde tutulmasını istersiniz, böylece hangi çiftlerin aralıkta olabileceklerini kolayca sıfırlayabilirsiniz (eğer "aralık aralığındaki başlangıç ​​yineleyicisi" belirtilen aralığın sonunda gelirse) Bakıyorsunuz, sonra bunu kontrol etmeyi - ve daha sonra - yineleyici çiftlerini) atlayabilirsiniz.

+0

Harita/kümenin Aralıklı Ağaçlar olarak nasıl uygulanabileceğine biraz daha açıklayabilir misiniz? – Kyuubi

+0

@Kyuubi: Bir std :: map'/'std :: set' (std :: map'/'std :: set' ile başlayan ve bir aralık ağacıyla biten bir ara ağaç oluşturmayı önerdim ** ** DEĞİL ** bir aralık ağacıyla başlayıp “std :: map”, “std :: set”). –

+0

@Kyuubi Belleğe gitmek, fikrin basitçe (1) bir şeyler koleksiyonuna sahip olduğunuzu, (2) aradığınız aralığın aralıklarının listesini, (3) ile aralıkları tanımladığınızı düşünüyorum. başlangıç ​​'ve' son 'yineleyiciler. Yani, bir 'std :: map' kullanarak,' begin' yineleyicisinin anahtar olması yeterli olabilir ve karşılık gelen 'end' yineleyici değeri olabilir. Bunu kullanarak, tek bir çekimde istediğiniz tüm aralıkları bulamazsınız, ancak filtrelemek için gerek duyduğunuz aralıkları daraltabilirsiniz. –

4

C++, https://github.com/ekg/intervaltree'da şablon tabanlı bir aralık ağacı uygulaması yazdım. MIT lisansı. Keyfini çıkarın.

+3

Bu uygulamanın, oluşturulduktan sonra ağacı değiştiremeyeceğini, yani statik aralıklı ağaçlar oluşturduğunu unutmayın. 'Dinamik' ağaçlar için http://web.mit.edu/~emin/www.old/source_code/cpp_trees/index.html adresine bakın. – logion

1

Ayrıca, this link numaralı Uluslararası Ağında bir C# uygulaması var. İhtiyacı olanlar için C++ 'ya çevirmek yeterince kolay