【问题标题】:How to lookup an integer in an N sized list in constant time?如何在恒定时间内在 N 大小的列表中查找整数?
【发布时间】:2015-04-03 04:34:18
【问题描述】:

列表的属性:

  1. 大小必须为 N,其中 N 是整数的数量

  2. 没有空单元格

  3. 数字可能不是完全连续的(即 {-23,-15,-3,1,2,6,7,8,15,100})

  4. 插入/查找需要在恒定时间内。

我的第一直觉是使用哈希表,但这会创建未使用的单元格,其中会跳过数字。

如果该列表中存在一个数字,是否可以构造这样的列表以检查恒定时间?

【问题讨论】:

  • 你可以使用一个元素向量,比如V[i+k] = j,比如L[j]=i,其中k是一些起始偏移量,V和L分别是你的向量和列表?这似乎是作弊,因为它基本上绕过了技术性要求 2。
  • 您需要保留订单吗?如果您不需要订单,Set 会起作用。即使那样,您也可以使用类似于 Java 的 LinkedHashSet
  • Codie:矢量的想法听起来很合理,需要进一步调查。 Mateusz:我忘了说插入和查找需要在恒定时间内进行,但是 log n 插入还不错,这可能是我目前最好的选择。
  • @OneEyed well LinkedHashSet 应该提供恒定的时间插入、查找和删除。不确定您是否在寻找特定于平台的解决方案,但您可以检查该平台是否具有等效的数据结构,或者只是检查 Java 的源代码并自己实现它
  • “不浪费空间”是一个非常不适定的约束。此外,我们应该如何为 size 字段留出空间?将空数据结构的大小降至 0 几乎是不可能的。

标签: algorithm list constant-time


【解决方案1】:

按照我的 cmets,您可以使用 Set,具体取决于您的具体用例,如果您需要维护文档中规定的顺序,您可以查看 Java 的 HashSetLinkedHashSet 等内容是恒定的时间:

与 HashSet 一样,它为基本的 操作(添加、包含和删除),假设哈希函数 在桶之间适当地分散元素。

如果您正在寻找其他平台的解决方案,也许有等效的实现,或者您可以查看 Java 的源代码并自己实现。

【讨论】:

  • 哈希表的复杂度为 O(1),查看摊销时间,但查看单个操作时没有。在最坏的情况下,哈希表有 O(N) 。
  • @LukaRahne 你能扩展一下吗?如果发生冲突,哈希表的最坏情况是 O(n) 复杂性,是的,但我看不出它会是 O(N^2) 吗?这并不是真正的摊销时间,只是当您遇到很多冲突时,您会将每个存储桶降级为一个列表,或者您需要重新哈希条目 N 次。此外,我们在这里讨论的是数字,因此即使我们有重复项,这也并不适用,因为我们不会有多个具有相同哈希码的条目。
  • 我在 O(N^2) 上犯了错误。相反,可以构造这样的一组操作,使 N(插入/删除/查找)操作将导致 O(N^2) 时间。
  • @LukaRahne 只有当你有哈希冲突并且可以有重复时。在这里,我们对数字进行操作,因此我们不会对同一个哈希码有多个值。
  • 在这种情况下,如果您在现代系统上使用整数,则需要分配 64 * 2^64 位的内存,以便在不冲突的情况下存储任意 64 位数字。
猜你喜欢
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2016-11-12
相关资源
最近更新 更多