2009-10-23 9 views

答えて

17

structmapsを使用できます。 1を定義するには:

(defstruct bintree :left :right :key) 

インスタンスを作成するには:

(struct-map bintree :left nil :right nil :key 0) 

あなたは、このような構造体の値にアクセスすることができます

(:left tree) 

など

それとも、新しいアクセサ関数を作成できます:

(def left-branch (accessor bintree :left)) 

し、それを使用します。

(left-branch tree) 
+0

これはネストされたリストまたはベクターを使用するよりもどのように優れていますか? – Zaz

+1

鍵は名前がつけられており、一定時間のアクセスが保証されています(リストは線形アクセスですが、ベクトルは一定です)。これは2009年に書かれたものですが、それ以来多くの変更がありました。私はスキームの 'define-structure'についての質問だったので、' defstruct'だけを推奨していました。 –

1

Clojureは分かりませんが、私はSchemeでこれをやっているのと同じ方法だと思います。define-struct ...左右の枝を一緒に共謀させないでください。何かを見つけるには、原子を打つまで繰り返す。

真剣には、あなたが望むようにstructmapsが鳴ります。私はthis pageを見つけました。半分ほど下にあるstructmapsを探してください。

1

あなただけのキーを比較するためにさまざまな機能が必要な場合は、すべてのソートマップが本当に木である(言語ですでに定義されている木を使用することです最も簡単な方法は、 sorted-map-byを使用してください)。

;;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" 
+1

ソートされていませんか?私はそれがよりフィットすると思うし、キーはあなたが保管する構造体の一部である可能性があります。 sorted-mapは、キーを切り離し、永久に別々に扱うよう強制します。 –

+0

+1とにかく、私が言っていたことに近いですが、質問されたときに私はその質問を見たことがあります。 –

関連する問題