【问题标题】:Best data structure for a given set of operations - Add, Retrieve Min/Max and Retrieve a specific object给定操作集的最佳数据结构 - 添加、检索最小值/最大值和检索特定对象
【发布时间】:2011-10-10 15:29:24
【问题描述】:

我正在寻找支持以下操作的最优(时间和空间)最优数据结构:

  1. 将人员(姓名、年龄)添加到人员的全球数据存储中
  2. 获取具有最小和最大年龄的人
  3. 根据 name 搜索 Person 的 age

这是我能想到的:

  • 保留一个 Person 数组,并在要添加新 Person 时继续添加到数组末尾
  • 保留人名与年龄的哈希值,以帮助获取具有给定名称的人的年龄
  • 为具有最小和最大年龄的人维护两个对象 minPerson 和 maxPerson。如果需要,请在添加新人员时更新此内容。

现在,虽然我保留了一个散列以提高 (3) 的性能,但我认为如果散列中有很多冲突,我认为这可能不是最好的方法。此外,添加 Person 意味着添加到哈希的开销。

这里有什么可以进一步优化的吗?

注意:我正在寻找在最短的时间和空间内支持所有这些操作的最佳(平衡)方法。

【问题讨论】:

  • 不需要数组。只是哈希 + min 和 max 应该可以工作。请注意,这样的结构不支持从中删除,因为这可能会使最小值或最大值无效。

标签: algorithm data-structures


【解决方案1】:

你可以去掉数组,因为它没有提供其他两个结构不能做的任何事情。

否则,哈希表 + 最小值/最大值很可能适合您的用例。事实上,这正是我会使用的。

关于摆脱哈希表,因为糟糕的哈希函数可能会导致冲突:好吧,不要使用糟糕的哈希函数。我敢打赌,由您选择的编程语言提供的字符串默认散列函数开箱即用。

【讨论】:

  • 是的,如果我使用哈希表,则不需要数组。但我觉得哈希需要完全消除 - 但不确定什么最能取代它。
  • 为什么要避开哈希表?哈希表是所有软件工程中最好的数据结构之一。不用担心;没有人会给 100,000 个孩子起奇怪的名字来攻击你的哈希函数。
  • @Saket - 为什么要摆脱哈希表?哈希表在这项任务中表现得非常好。
  • 我只是在想我是否可以避免它。我理解它是最好的选择之一(因此,我很难考虑不同的方法:))。我实际上正在为所有这些操作寻找最佳(平衡)出路。我很好,如果我的解决方案已经听起来(接近)完美:)
【解决方案2】:

看起来您需要一个需要快速插入并且还支持对 2 个不同键(姓名和年龄)进行快速查询的数据结构。

我建议保留两个数据结构,一个是排序数据结构(例如平衡二叉搜索树),其中键是年龄,值是指向 Person 对象的指针,另一个是哈希表,键是name 和 value 是指向 Person 对象的指针。请注意,我们不会保留同一个对象的两个副本。

平衡二叉搜索树将提供 O(log(n)) 插入和最大/最小查询,而 hastable 将提供 O(1)(摊销)插入和查找。

当我们添加一个新的 Person 时,我们只需将一个指向它的指针添加到两个数据结构中。对于最小/最大年龄查询,我们可以通过查询 BST 来检索对象。对于名称查询,我们可以只查询哈希表。

您的问题不要求更新/删除,但也可以通过适当地更新两个数据结构来实现。

【讨论】:

    【解决方案3】:

    听起来您希望名称是唯一标识符;否则您的操作 3 不明确(如果您有两个 John Smith 条目,正确的返回结果是什么?)

    假设名称的唯一性得到保证,我将使用以名称为键的普通哈希表。操作 1 和 3 执行起来很简单。如果您想手动搜索数据结构,则操作 2 可以在 O(N) 时间内完成,或者您可以按照您的建议进行操作并跟踪最小值/最大值并在添加/删除哈希表中的条目时对其进行更新.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 2021-07-04
      相关资源
      最近更新 更多