首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有向量的交集函数?

有没有向量的交集函数?
EN

Stack Overflow用户
提问于 2017-12-09 03:35:11
回答 1查看 69关注 0票数 1

人们经常会发现,与向量相比,列表具有性能劣势的语句,这是因为consing和额外的gc步骤,以及一些函数在接受列表和向量的通用序列上的工作。

但是像intersection这样的一些函数需要两个列表。有没有为矢量提供替代方案的库?

我从这样的东西开始,但感觉应该有一个更成熟的解决方案。

代码语言:javascript
复制
(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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-09 06:10:06

它总是取决于你的集合的大小以及你想要用它做什么。

在大约20到50个元素以下,列表通常是完全可以的,即使是随机访问(如果你不是在一个紧密的内部循环中,或者没有太多的关注)。

如果你已经有了向量,那么对其中一个向量进行排序可能是最方便的,这样你就可以进行二进制搜索,而不是天真的线性搜索。如果这还不够,而且您的集合更大,那么将元素放入哈希表(作为键,带有适当的:test)可以提供更快的(分期)查找。

这应该会让你走得很远。如果您发现了一个无法通过这种简单方法解决的问题,那么您可能希望研究一下FSetCL-Containers,它们支持更高级的数据结构。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47721050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档