根据https://hackage.haskell.org/package/containers-0.5.7.1/docs/Data-IntSet.html,查找int是否在member
中的IntSet
函数需要O(min(n,W))时间,其中{{1} }是n
中的元素数,32位机器上的W = 32,64位机器上的64。
我想在实践中,W可能小于n,因此函数将是O(W)时间。
在实践中(在固定架构上),O(W)是常量,因此该函数可能运行得非常快(或者至少不会因n的函数而变慢)。
然而,从理论上讲,这并不是那么快。如果我们允许整数a 1,...,aₙ无限大小(并让IntSet
,其中W = log a
,那么这个函数在O(log a)中运行。为什么我们不能使用散列并实现O(1)此功能的摊销成本是什么?
(上下文:我正在进行算法作业分配,对于问题的部分伪代码,我希望有一个数据结构可以检查整数是否是我的集合的成员在恒定时间内,无论集合中的整数数量,或集合中整数的大小。我尝试查找Haskell a = maxₚ aₚ
- 就像数据结构一样灵感。)
答案 0 :(得分:3)
正如@DerekElkins在评论中所说,只读一个无限大小的整数需要最少的O(log a)时间。因此,在任何意义上都不可能做得更好。
如果你没有固定大小的原语,基本上什么都不是O(1)。