Şemada, bir ikili arama ağacı yapmak için define-struct
kullanabilirim, fakat bunu Clojure'da nasıl yapıyorsunuz?Clojure'da ikili arama ağacını nasıl yaparsınız?
cevap
Yapı eşlemelerini kullanabilirsiniz. birini tanımlamak için:
(struct-map bintree :left nil :right nil :key 0)
Sonra böyle bir yapı içinde değerleri erişebilir:
(defstruct bintree :left :right :key)
bir örneğini yapmak için
(:left tree)
vb
Yoksa yeni erişim fonksiyonları oluşturabilir:
(def left-branch (accessor bintree :left))
ve kullanmak:
(left-branch tree)
Clojure'u bilmiyorum, ama bahse girerim, define-struct
olmadan şemada yaptığınız gibi ... sadece sol ve sağ dalları bir araya getirir. Bir şey bulmak için, bir atomu vurana kadar nüks edin.
Gerçekten de, structmaps istediğiniz gibi geliyor. this page'u buldum. Aşağıya doğru aşağıya doğru yapı haritalarını arayın.
basit şekilde olacaktır zaten (her sıralanmış haritası gerçekten bir ağaç dilde tanımlanan ağacını kullanmak için, sadece anahtarlarını karşılaştırmak için farklı işlev gerekirse, sıralanmış-harita-kullanarak).
;;define function for comparing keys
(defn compare-key-fn [key1 key2] (< key1 key2))
;;define tree and add elements
(def my-tree
(-> ;;syntax sugar
(sorted-map-by compare-key-fn) ;;this returns empty tree with given function to compare keys
(assoc 100 "data for key = 100") ;;below we add elements to tree
(assoc 2 "data for key = 2")
(assoc 10 "data for key = 10")
(assoc -2 "data for key = -1")))
;;accesing elements by key
(prn "element for key 100 =" (my-tree 100))
;;"erasing" elements from tree - in reality, what we are really doing, is returning a new tree that contains all elements of the old one, except the element we've just erased.
(def my-new-tree
(dissoc my-tree 2))
(prn my-new-tree) ;; to verify, that element 2 is "erased"
Sıralanmamış mı? Bunun daha iyi bir uyum olacağını düşünüyorum ve anahtar depoladığınız yapıların bir parçası olabilir. Sıralı harita, anahtarı ayırmanızı ve sonsuza dek ayrı ayrı ele almanızı zorlaştırır. –
+1 yine de, ne söyleyebildiğime yakın, sorulduğu zaman soruyu tekrar görmüştüm. –
- 1. İkili Arama Ağacını sil
- 2. İkili Arama Ağacı Dizisi Çıktısı
- 3. Dizi İçinde İkili Arama
- 4. Yazdırma Düzeni Sırası İkili Arama Ağacı Biçimlendirme
- 5. İkili Arama C++ STL
- 6. İkili Arama Sonlandırma Durumu
- 7. ruby'de ikili arama ağaçları
- 8. Yinelemeli ikili arama algoritması nasıl uygulanır?
- 9. İkili Arama Ağacında verileri güncelleştirme
- 10. Orientdb'de kenarı nasıl benzersiz yaparsınız
- 11. python'daki ikili arama ağaçlarını temsil eder
- 12. Bir ikili arama ağacının derinliğini hesaplama
- 13. Ruby # index Yöntem VS İkili Arama
- 14. D 2.0'de (Phobos) İkili Arama mı?
- 15. Java İkili Arama <Identifier expected>
- 16. Sfenks TOC ağacını değiştirin
- 17. Bir React-Relay uygulamasında dosya yüklemelerini nasıl yaparsınız?
- 18. Java'da ikili ağaçta derinlikli ilk arama (DFS) nasıl uygulanır?
- 19. İkili arama ağacında en küçük değer nasıl bulunur?
- 20. Perl düzenli ifadesine nasıl yorum yaparsınız?
- 21. PHP'de Düzenli İfadenin */Parçasını Nasıl Yorum Yaparsınız?
- 22. Lambda İfade Ağacını Çoklu Koşullarla Nasıl Oluşturun
- 23. Oyun Geliştirme: Hikaye oyununu nasıl yaparsınız?
- 24. Neo4j Web admin konsolu'ndan nasıl çıkış yaparsınız?
- 25. \ sembolünü cout kullanarak nasıl çıkış yaparsınız?
- 26. Geçerli çalışma dizinine log4net çıkışını nasıl yaparsınız?
- 27. Proje klasörü ağacını nasıl gizleyebilir ve gösterebilirim?
- 28. TFS İçinde Kod Kapsamını Nasıl Yaparsınız?
- 29. Nasıl C# gibi site içi delege yaparsınız?
- 30. İşlev çağrıları için __call() yöntemini nasıl yaparsınız?
Bu nasıl iç içe geçmiş bir liste veya vektör kullanmaktan daha iyidir? – Zaz
Anahtarlar adlandırıldığı ve sabit zamanlı erişim garantisine sahip oldukları için daha iyi olur (listeler vektörler sabit olsa da doğrusal erişimdir). Bu, 2009 yılında yazıldı ve o zamandan beri çok şey değişti. Ben sadece 'defstruct' öneriyordum çünkü soru şemanın 'yapı-yapısı' ile ilgiliydi. –