非常に多くの場合、consingと追加のgcステップとリストとベクタを受け入れるジェネリックシーケンスに対するいくつかの関数の働きにより、リストはベクタに比べてパフォーマンスの面で不利になるという文が見つかる。ベクトルの交差関数はありますか?
しかし、intersection
のようないくつかの関数は2つのリストを期待しています。ベクトルの代替手段を提供するライブラリはありますか?
私はこのようなことから始めましたが、より成熟した解決策が必要だと感じました。
(defun vec-intersec (vec-1 vec-2 &aux (result (make-array 0 :adjustable t :fill-pointer 0)))
"A simple implementation of intersection for vectors instead of lists."
(loop :for v1 :across vec-1
:if (find v1 vec-2 :test #'equal)
:do (vector-push-extend v1 result))
result)
操作は2次です。 パフォーマンスを意識している場合は、ハッシュテーブルを使用します。 それ以外の場合はリストに変換します。 – sds
「ハッシュテーブルを使用する」の詳細を教えてください。ベクトルの代わりに、または 'find'を避けるための中間構造として? –
HTメンバシップテストには一定のコストがありますので、それらを使用してセットを表すことは理にかなっています。 'Find'は線形なので、常に最適ではありません。 – sds