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

Algorithm 给定操作集的最佳数据结构-添加、检索最小值/最大值和检索特定对象,algorithm,data-structures,Algorithm,Data Structures,我正在寻找支持以下操作的最佳(时间和空间)数据结构: 将人员(姓名、年龄)添加到人员的全局数据存储中 取最小和最大年龄的人 根据姓名搜索某人的年龄 以下是我能想到的: 保留一个人员数组,并在要添加新人员时将其添加到数组末尾 保留人名与年龄的散列,以帮助获取人名的年龄 为具有最小和最大年龄的人维护两个对象minPerson和maxPerson。如果需要,在添加新人员时更新此内容 现在,虽然我保留了一个hash来提高(3)的性能,但我认为如果hash中有很多冲突,这可能不是最好的方法。此外,添加

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

  • 将人员(姓名、年龄)添加到人员的全局数据存储中
  • 取最小和最大年龄的人
  • 根据姓名搜索某人的年龄
  • 以下是我能想到的:

    • 保留一个人员数组,并在要添加新人员时将其添加到数组末尾
    • 保留人名与年龄的散列,以帮助获取人名的年龄
    • 为具有最小和最大年龄的人维护两个对象minPerson和maxPerson。如果需要,在添加新人员时更新此内容
    现在,虽然我保留了一个hash来提高(3)的性能,但我认为如果hash中有很多冲突,这可能不是最好的方法。此外,添加一个人将意味着添加到散列的开销

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


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

    您可以摆脱阵列,因为它不提供其他两个结构无法提供的任何功能

    否则,hashtable+min/max可能会在您的用例中表现良好。事实上,这正是我要用的


    至于去掉哈希表,因为糟糕的哈希函数可能会导致冲突:好吧,不要使用糟糕的哈希函数。我敢打赌,您选择的编程语言为字符串提供的默认哈希函数将非常现成。

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


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

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

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

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

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


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

    是的,如果我使用哈希表,则不需要数组。但我觉得需要完全删除哈希表,但不确定什么可以最好地替代它。为什么要避免使用哈希表?哈希表就是其中之一所有软件工程中最好的数据结构之一。别担心,没有人会给100000个孩子起奇怪的名字来试图攻击你的哈希函数。@Saket-你为什么要去掉哈希表?哈希表在这项任务中表现得非常好。我只是在想我是否可以避免它。我理解它是其中之一st选项(因此,我很难想出一种不同的方法:)。实际上,我正在为所有这些操作寻找最佳(平衡的)出路。如果我的解决方案听起来(接近)完美,那我就没问题了:)不需要阵列。只有散列+最小值和最大值应该有效。请注意,这样的结构不支持从中删除,因为这可能会使最小值或最大值无效。