2011-12-12 110 views

回答

6

這將工作,沒有遍地遍歷整個向量:

(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)]) 
4

「百萬元」是不是很多。試試這是否足夠快:

(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正常工作。

4

其他的答案中給出這樣做的好方法,但是你所描述基本上是一個爲O​​(n^2)操作假設你真正實現所有的延遲序列等,這可能不會是一個好主意,當n> = 1,000,000

您可能想考慮擴大您正在考慮的代碼的範圍,以瞭解您是否可以總體找到更有效的算法。

例如,你可能會發現,是最好的整個列表轉換成向量,並在索引訪問爲載體條款寫你的算法。

1

關於使用套如何?

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 
相關問題