haskell - Haskell的Data.Vector没有提供集合运算符,原因是什么

标签 haskell vector set operations

我的应用程序涉及大量数组操作(例如 log(1) 索引),因此 Data.VectorData.Vector.Unboxed优先于Data.List 。 它还涉及许多集合操作(​​例如 intersectBy),但是 Data.Vector 不提供这些操作。

每个函数都可以像 Data.List 中那样用 3-4 行来实现。 有什么原因它们都没有用 Data.Vector 实现吗?我只能推测。也许出于性能原因,不鼓励在 Data.Vector 中进行集合操作,即 intersectBy 首先通过列表理解生成交集,然后将列表转换为 Data.Vector?

最佳答案

我认为它丢失了,因为未排序、不可变数组的交集必须具有Ω(n*m)的最坏情况运行时间,而不使用额外的空间和Data.Vector 针对性能进行了优化。如果您愿意,您可以自己编写该函数:

import Data.Vector as V

intersect :: Eq a => V.Vector a -> V.Vector a -> V.Vector a
intersect x = V.filter (`V.elem` x)

或者使用a temporary set data structure达到预期的 O(n + m) 复杂度:

import Data.HashSet as HS

intersect :: (Hashable a, Eq a) => V.Vector a -> V.Vector a -> V.Vector a
intersect x = V.filter (`HS.member` set)
    where set = HS.fromList $ V.toList x

如果您能负担得起额外的内存使用量,也许您可​​以为数据使用某种聚合类型,例如用于快速随机访问的数组和用于快速随机访问的哈希特里树,例如 Data.HashSet成员资格检查并始终使两个容器保持最新。这样你就可以将交集的渐近复杂度降低到类似 O(min(n, m))

关于haskell - Haskell的Data.Vector没有提供集合运算符,原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15708971/

相关文章:

c++ - std::vector 及其初始化指针一致性

vector - 试图在Rc <RefCell <... >>内部修改 future Vec

arrays - 如何在 native Swift 中实现以前称为 NSMutableOrderedSet 的可变有序集泛型类型?

filter - 对抽象过滤器进行操作(列表理解): Combining two filters

haskell - 将函数组合成一个返回元组的函数

haskell - 如何在 Haskeline 中在运行时更改 Tab 完成的内容?

haskell - 在Haskell中连接列表中元组的第二个元素

performance - 调试 GHC 的约束求解器导致的编译时性能问题

c++ - vector .erase 错误 c2664

java - Java中获取具有一定大小子集的集合的幂集