haskell - 为什么 IntSet 查找是 O(min(n,W)),而不是 O(1)?

标签 haskell data-structures integer set lookup

根据https://hackage.haskell.org/package/containers-0.5.7.1/docs/Data-IntSet.htmlmember 函数查找 intSet 中是否有一个 int,需要 O(min(n,W)) 时间,其中 n > 是 IntSet 中的元素数量,在 32 位机器上 W = 32,在 64 位机器上 W = 64。

我想在实践中,W 可能小于 n,因此该函数的时间为 O(W)。

在实践中(在固定架构上),O(W) 是常数,因此该函数可能运行得非常快(或者至少不会因为 n 的函数而变慢)。

但是,从理论上讲,这并没有那么快。如果我们允许无限大小的整数 a₁,...,aₙ(并令 W = log a,其中 a = maxₚ aₚ,则该函数运行时间复杂度为 O(log a). 为什么我们不能使用哈希来实现该函数的 O(1) 摊余成本?

(上下文:我正在做一个算法作业,对于一个问题的伪代码的一部分,我希望有一个数据结构可以在恒定时间内检查一个整数是否是我的集合的成员,无论集合中整数的个数,或者集合中整数的大小。我尝试查找类似 Haskell Set 的数据结构来获取灵感。)

最佳答案

正如 @DerekElkins 在评论中所说,仅读取单个无限大小的整数至少需要 O(log a) 时间。因此,在任何意义上都不可能做得更好。

如果没有固定大小的基元,基本上没有什么是 O(1) 的。

关于haskell - 为什么 IntSet 查找是 O(min(n,W)),而不是 O(1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35124851/

相关文章:

haskell - CodeChef 超时

C++ ⎼ 两个相似的函数,但表现却大不相同

c++ - 删除未使用或冗余的代码

data-structures - 如何确定没有正在运行的作业或消费者进程退出

haskell - 我可以说服 stack/ghci *仅*加载本地 .ghci 文件吗?

haskell - 将 Data.Time.UTCTime 与 ByteString 相互转换

c++ - 如何找到数组的大小作为 int

c++ - 在 C 中使用 32 位整数的未使用内存

Haskell 将单个值应用于函数列表

c - 为什么 C 隐式转换像它们那样运行?