给定操作集的最佳数据结构 - 添加,检索最小/最大和检索特定对象

时间:2011-10-10 15:29:25

标签: algorithm data-structures

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

  1. 将人员(姓名,年龄)添加到人员的全球数据存储
  2. 获取年龄最小和最大的人
  3. 根据名称
  4. 搜索人的年龄

    这是我能想到的:

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

    现在,尽管我保留了哈希以获得更好的(3)性能,但我认为如果哈希中存在许多冲突,它可能不是最好的方法。此外,添加Person意味着添加哈希值的开销。

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

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

3 个答案:

答案 0 :(得分:4)

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

否则,散列表+ min / max可能对您的用例表现良好。事实上,这正是我要用的。

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

答案 1 :(得分:1)

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

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

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

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

您的问题不要求更新/删除,但通过适当更新两个数据结构也可以做到这一点。

答案 2 :(得分:0)

听起来你希望这个名字是独特的识别者;否则你的操作3是不明确的(如果约翰史密斯有两个条目,那么正确的返回结果是什么?)

假设名称的唯一性得到保证,我会选择一个由名称键入的普通哈希表。操作1和3很难执行。如果您想手动搜索数据结构,可以在O(N)时间内完成操作2,或者您可以按照建议操作并跟踪最小值/最大值并在添加/删除哈希表中的条目时更新它