【问题标题】:How to use array to design a data structure that has O(1) for get, insert, delete如何使用数组设计具有 O(1) 的获取、插入、删除数据结构
【发布时间】:2015-05-22 20:22:14
【问题描述】:

面试题:如何使用数组设计一个获取、插入、删除O(1)的数据结构?

我的想法是首先选择一个素数作为数组的大小,然后使用“mod by the size of array”作为简单的哈希函数。对于数组中的每个点,我们存储一个链表来处理碰撞。

有没有更好的解决方案?

【问题讨论】:

  • O(1) 最多? Binary search algo. 哈希表也可以。如果你能创造出一个平均或最差 O(1) 的新结构,你应该成为一名大学教授。
  • 您正在尝试以不打算使用的方式使用数据结构。如果索引已知,则数组旨在用于快速检索/插入/删除。这个结构基本上已经做好了;一个杂烩。如果您的目标是〜O(1),那么您应该查看哈希表的实现,而不是尝试以不打算使用的方式更改结构。
  • 但如果你在面试中被问到,你不能告诉他们
  • @EvanBechtol 许多哈希表是使用数组实现的,因此一个合理的答案是“制作基于数组的哈希表”(以及如何执行此操作的详细信息)。
  • @user3692521 我实际上认为告诉你的面试官“这不只是一个哈希表吗?”可能是个好主意。并从那里开始讨论。他们可能会问您对哈希表了解多少,这可能会引导您就另一个主题进行良好的对话。如果他们说“是的,现在开始编写代码”,那么你就去实现一个哈希表。只要你一直诚实有礼貌,我看不出这种事与愿违。

标签: arrays data-structures hashtable


【解决方案1】:

您提到的方法是用于解决冲突的chaining 技术,该技术在大多数实现中得到了最广泛的应用和实施。正如其他人所评论的那样,几乎不可能实现一个保证 O(1) 获取、插入和删除的 HashMap。

此外,要实现仅包含数组的地图,您可以使用open-addressing 方法来解决冲突。这是一种不同的冲突解决技术,其中不使用指针,只是一个大于地图中存储的最大元素数的数组。有几种方法可以实现基于开放寻址的冲突解决,但其中最简单的是线性探测技术。你可以阅读更多关于它的实现here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多