Clojureの入門者として、最も簡単なことを表現するのが難しい場合がよくあります。たとえば、PythonでClojureでベクトルの最後の要素を置き換える方法
v[-1]=new_value
なり、ベクトルの最後の要素を交換するために、私はClojureの中に、以下の亜種で終わる:
言ってかなり長く、無表情で(assoc v (dec (count v)) new_value)
最小、または
(conj (vec (butlast v)) new_value)
実行時間がO(n)
であるため、さらに悪化します。
それはクラブでスイスの時計を修復しようとしている洞窟人のように、私には馬鹿げた感じがします。
ベクトルの最後の要素を置き換える正しいClojureの方法は何ですか?だから、基本的に10時間、それは10倍遅い要素数の
(def v (vec (range 1e6)))
#'user/v
user=> (time (first (conj (vec (butlast v)) 55)))
"Elapsed time: 232.686159 msecs"
0
(def v (vec (range 1e7)))
#'user/v
user=> (time (first (conj (vec (butlast v)) 55)))
"Elapsed time: 2423.828127 msecs"
0
:
は
butlast
-version(Clojureは1.8)のための私の
O(n)
-claimをサポートするために。
あなたの最初の方法は、それがどのように行われるかです。明らかに、あなたはそれをきれいにするために "最後に置き換える"関数を書くことができます。私はそれを表現するPythonの過度の簡潔な方法は残念なことにあなたの期待を損なってしまったと思います。私はClojureで独自の構文を保証するために、しばしば後方からの索引付けが必要であるとは思わない。 +1が間違っていることを証明したいからです。 – Carcigenicate
注: 'v'がすでにベクトルであれば、解#3はO(n)ではありません(測定が別の方法で証明されない限り、Clojureベクトルをデフォルト選択として常に使用することをお勧めします)。 –
これはよく区切られた特定の質問と答えですが、私は、Pythonでインデックス式で表現された多くのアルゴリズムが、インデックスを使用する必要のない慣用的なClojureの同等物を持っていることを指摘する価値があると思います。 – glts