2016-11-01 1 views
3

私は、時間を表すいくつかのキーとその都度の値がある問題があります。小さな例:Clojureソートマップ:x以下の最大のキーを見つける(フロアキー)

(sorted-map -4 "a" -1 "b" 2 "c" 3 "d") 

与えられたxについて、私はx以下の最大の鍵を見つけたいと思います。

searchsortedlast(SC、k)は引数SCはSortedDict、SortedMultiDict又は たSortedSetであり、kは、鍵などのジュリア・データ構造パッケージの例えば

は方法にソート辞書があります。このルーチンは、キーがk以下であるコンテナ内の最後の項目 のセミトケンを返します。 にそのようなキーがない場合は、開始前セミトケンが返されます。 時間:O(Cログn)は

私はClojureの中に同様の機能についてのドキュメントを見つけるためにしようとしているが、何かを見つけることができませんでした。 私の単純なアプローチは、以下の通りである:

(MAX(フィルタ#(<% x)から(キー(ソートマップ-4 "" -1 "B" 2 "C" 3 "D" を適用します-10- "e"))))))))))))))))))))))))))))012)

私はこれがまずすべてのキーを収集し、それらをフィルタリングし、不要な計算を作成するので、これは最適ではないと思います。

私の質問は です。1)既に見つかっていない機能を実装しているのですか? 2)これが当てはまらない場合は、Javaのデータ構造を検索し、Javaのデータ構造と関連するメソッドを使用する必要があります。 3)私のアプローチを怠惰にして効率的にすることは可能ですか?

EDIT:JavaのTreeMapのより

K floorKey(Kキー)そのようなキーが存在しない場合の最大以下 指定された鍵と同じ鍵、またはnullを返します。

これは私がclojureソートマップでお探しのものです。ソートマップを放棄し、Javasのツリーマップで作業する必要がありますか?

EDIT2:

私はあなたがsubseqrsubseqを使用することができますソートマップのようなソートされたコレクションでの作業のために「最も近いキー」機能

答えて

1

と代替ソートマップ実装を提供し、この https://github.com/clojure/data.avl を見つけました。あなたが使用できる最大のキー以下とxのエントリを見つけるためにあなたの例では

(let [m (sorted-map -4 "a" -1 "b" 2 "c" 3 "d") 
     x 0] 
    (first (rsubseq m <= x))) 
;; => [-1 "b"] 
+1

あなたは、この検索の計算の複雑さを知っていますか?treemapの場合はlog nとなります – Lindon

+1

'sorted-seq'の要素へのアクセスはlog n(http://clojure.org/reference/data_structures#Maps)です。実際には、彼らは 'PersistentTreeMap'アンダーフー(https://github.com/clojure/clojure/blob/clojure-1.8.0/src/clj/clojure/core.clj#L398)です。 'subseq'と' rsubseq'はそれぞれ、 '>'/'> ='と '<'/'<='の元のコレクションの "views"として、あるいは他のテスト関数の 'take-while ' 。 –

+1

ソートマップの新しい実装が見つかりました(EDIT 2を参照)。リンクされた実装を使用する代わりに、あなたの提案した方法を実行する利点はありますか? – Lindon

関連する問題