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
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.
C++, https://github.com/ekg/intervaltree'da şablon tabanlı bir aralık ağacı uygulaması yazdım. MIT lisansı. Keyfini çıkarın.
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
Ayrıca, this link numaralı Uluslararası Ağında bir C# uygulaması var. İhtiyacı olanlar için C++ 'ya çevirmek yeterince kolay
- 1. C# Sudoku algoritması C#
- 2. C++ b-ağacı birleştirme
- 3. Rijndal Algoritması kullanarak C#
- 4. dize gruplama algoritması C#
- 5. euclid'in genişletilmiş algoritması C++
- 6. C#/NET uygulamasının yürütülmesini hızlandırma
- 7. Beceri ağacı nasıl oluşturulur?
- 8. : aralık
- 9. C# 'daki sonek ağacı uygulaması mı arıyorsunuz?
- 10. C5 algoritması uygulaması?
- 11. Belirli bir aralık için dizi değerlerini C#
- 12. C# Perceptron Algoritması (Bir dosyada okuma)
- 13. Çok Desenli Eşleme Algoritması
- 14. NSArrayController'da belirli bir öğenin bulunması
- 15. Dizelerin bulunması% dizede% dizenin diğer vektörü
- 16. Web uygulamasının veya hizmetin IIS
- 17. Bir Karar Ağacı Oluşturma
- 18. C# .net uygulamasının MongoDB ile nasıl dağıtılacağı
- 19. Windows 8 C# Metro Uygulamasının GUI'sini Güncelleme
- 20. Basit bir bağımlılık algoritması ile ilgili sorunlar
- 21. Üçlü Arama Ağacı
- 22. ANTLR AST ağacı güncelleştirmesi
- 23. Tam aralık PostgreSQL veritabanında aralık dışı
- 24. Maksimum dikdörtgen algoritması uygulaması
- 25. : geçersiz aralık
- 26. Yürütme Aralık
- 27. Haskell'deki Knuth-Morris-Pratt algoritması
- 28. FileTable dizin ağacı oluştur
- 29. Bentley-Ottmann Algoritması Uygulaması
- 30. Randomize algoritması
Harita/kümenin Aralıklı Ağaçlar olarak nasıl uygulanabileceğine biraz daha açıklayabilir misiniz? – Kyuubi
@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”). –
@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. –