2016-06-28 6 views
4

コードでは、任意の大きなコレクションのO(1)またはO(log n)になるremove-nthsome-collを探しています。O(1)またはO(log n)の任意の要素を削除できるデータ構造はClojureにありますか?

(= 
    (remove-nth (some-coll "a" "b" "c" "d") 2) 
    (some-coll "a" "b" "d")) 

私は、標準ライブラリのみを使用するソリューションを探していることが望ましいですが、私は外部ライブラリを使用するソリューションに興味があります。

+0

私はあなたが大規模な任意のコレクション*を意味すると思います。 'n'個のアイテムを削除または構築するには、それらを1つずつ処理する必要があるので、' Omega(n) 'でなければなりません。 – Thumbnail

+0

@Thumbnailあなたは絶対に正しいです。それは私が意味していたことを表現するためのより明確な方法です。それに応じて変更されました。 –

答えて

4

標準ライブラリにはありませんが、finger trees(それらを紹介するオリジナルペーパーはhereです)が完了しています(一般的に素晴らしい機能データ構造です)。 O(log n)分割とO(log n)連結を介してO(log n)削除を得ることができます。

(defn remove-nth [xs n] 
    (let [[left _ right] (ft-split-at xs n)] 
    (ft-concat left right))) 

(def cdl (apply counted-double-list '[a b c d e f])) 

(remove-nth cdl 3) 
;; => (a b c e f) 

代替はまた、O(スライスを介して)(ログn)の分割及び連結を提供し(元の紙here有する)RRB-tree based vectors あります。さらに、Clojureの既存のベクターの上でこれをほぼ透過的に行うことができます。

+1

完全性のために、マップが要素のO(log n)削除をサポートしていて、常に整数でインデックスできることを追加します。あなたの 'remove-nth'は、あなたが指しているシーケンスを探していることを示唆していますが、フィンガーツリーとRRBツリーがサポートする他のシーケンスのような振る舞い(一定時間追加/直線構造)が必要なことを意味します。 – badcook

関連する問題