什麼是獲取包含對包含所有其他元素列表中的當前元素的列表中最快的方法是什麼?這應該是快速的,因爲列表可能包含一百萬或更多元素。獲取當前元素和Clojure中包含其他所有元素的列表?
例如給出的列表(1 2 3)
我想要得到的名單((1 (2 3)) (2 (1 3)) (3 (1 2)))
感謝您的幫助!
什麼是獲取包含對包含所有其他元素列表中的當前元素的列表中最快的方法是什麼?這應該是快速的,因爲列表可能包含一百萬或更多元素。獲取當前元素和Clojure中包含其他所有元素的列表?
例如給出的列表(1 2 3)
我想要得到的名單((1 (2 3)) (2 (1 3)) (3 (1 2)))
感謝您的幫助!
這將工作,沒有遍地遍歷整個向量:
(defn this-and-that [xs]
(map-indexed (fn [i x]
[x (concat (take i xs)
(drop (inc i) xs))])
xs))
,也適用於尼爾斯:
user=> (this-and-that [1 2 nil 3])
([1 (2 nil 3)] [2 (1 nil 3)] [nil (1 2 3)] [3 (1 2 nil)])
「百萬元」是不是很多。試試這是否足夠快:
(defn this-and-that
[s]
(map-indexed (fn [i el]
[el (keep-indexed #(if (= %1 i)
nil
%2) s)]) s))
例子:
user> (this-and-that [1 2 3])
([1 (2 3)] [2 (1 3)] [3 (1 2)])
請注意,此代碼不包含nil
seqs正常工作。
其他的答案中給出這樣做的好方法,但是你所描述基本上是一個爲O(n^2)操作假設你真正實現所有的延遲序列等,這可能不會是一個好主意,當n> = 1,000,000
您可能想考慮擴大您正在考慮的代碼的範圍,以瞭解您是否可以總體找到更有效的算法。
例如,你可能會發現,是最好的整個列表轉換成向量,並在索引訪問爲載體條款寫你的算法。
關於使用套如何?
user> (let [xs #{1 2 3}]
(for [x xs] [x (disj xs x)]))
([1 #{2 3}] [2 #{1 3}] [3 #{1 2}])
一組一百萬的項目這樣做是不是太糟糕的時候,明智的:
(let [xs (set (range 1000000))]
(time (count (for [x xs] [x (disj xs x)]))))
"Elapsed time: 841.668 msecs"
1000000