2

1 と 0 のベクトルが与えられた場合、値が 1 のエントリの数を数えたいと思います。ただし、ベクトルは非常に長くなる可能性があり、ベクトルに値が 1 のエントリが 0 個、1 個、または複数あるかどうかを知りたいだけです。

hereのアプローチを使用して、ベクトル内の 1 の数を数えることができます。

(count (filter #{1} [1 0 1 0 0 1 1]))

この場合、ベクトルの 3 つ以上の要素にアクセスしないようにフィルターを制限する (または他のアプローチを使用する) ことはできますか?

4

1 に答える 1

6

フィルタは怠惰なので、必要なだけの作業を行います。1がない、1つが1つ、または2つ以上あることだけを気にするので、1のフィルター処理されたシーケンスの最大2つの要素を調べるだけで済み、take 2カウントする直前に次のようになります。

user=> (count (take 2 (filter #{1} [1 0 1 0 0 1 1])))
2
user=> (count (take 2 (filter #{1} [0 0 0 0 0 0 0])))
0
user=> (count (take 2 (filter #{1} [0 0 0 0 0 0 1])))
1
user=> (def rare (repeatedly #(if (< (rand) 0.0001) 1 0)))
#'user/rare
user=> (take 10 rare)
(0 0 0 0 0 0 0 0 0 0)
user=> (count (take 2 (filter #{1} rare)))
2
于 2013-01-20T14:23:58.140 に答える