很多时候,人们会发现,与向量相比,列表具有性能劣势,因为有一些gc步骤和一些函数可以处理接受列表和向量的通用序列。
但是像intersection
这样的函数需要两个列表。是否有图书馆为载体提供替代方案?
我从这样的事情开始,但感觉应该有一个更成熟的解决方案。
(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)
答案 0 :(得分:3)
它总是取决于您的收藏的大小以及您想要用它做什么。
大约20到50个元素,即使是随机访问,列表也常常完全正常(如果你没有处于紧密的内循环中,或者需要大量投入)。
如果你已经有了矢量,那么对它们中的一个进行排序可能是最方便的,这样你就可以进行二分搜索而不是天真的线性搜索。如果这还不够,并且您的集合更大,则将元素放入哈希表(作为键,使用适当的:test
)可以更快(分摊)查找。
这应该会带你走得很远。如果您发现无法以这种简单方式解决的问题,您可能需要查看支持更高级数据结构的FSet或CL-Containers。