【问题标题】:Data structure with minimum value, oldest value, and key frequency具有最小值、最旧值和键频率的数据结构
【发布时间】:2015-09-30 20:44:19
【问题描述】:

我正在处理数据结构测试中的一个问题,我需要建议一个符合以下要求的数据结构S

注意:S 应该允许插入具有相同键的多个值

  • INSERT(S, k):将带有键 k 的对象插入到 S 与时间 复杂性O(lg n)
  • DELETE_OLD(S):删除S中最旧的对象,具有时间复杂度 O(lg n)
  • DELETE_OLD_MIN(S): 删除键最低的最旧对象 在S 中,时间复杂度为O(lg n)
  • MAX_COUNT(S):返回频率最高的key(最多 S 中的公共键),时间复杂度为 O(lg n)
  • FREQ_SUM(S,z):在S 中找到两个键(a 和 b),这样 frequency.a + frequency.b = z 时间复杂度 O(lg n)

我尝试了一些想法,但无法通过最后两个。

编辑:问题A data structure traversable by both order of insertion and order of magnitude 没有回答我的问题。请不要将其标记为重复。谢谢。

编辑 #2:freq_sum(S,z) 所做的示例:

假设一个调用freq_sum(S,5)的数据结构包含:2, 2, 2, 3, 4, 4, 4, 5, 5

2和5的组合可能是一个可能的答案,因为2在结构中存在3次,5存在2次,所以3+2=z

【问题讨论】:

  • 最后一个要求看起来与数据结构的关系不大,而与使用查找的算法更多。
  • @sds 这不是那个问题的重复
  • @EvanBechtol:我认为应用相同的方法非常相似。
  • @Tom Klino 除了最后一个和第三个之外,rest 可以在 log n 时间内轻松实现。你怎么看?

标签: algorithm data-structures time-complexity


【解决方案1】:

您可以使用Red-Black 来完成此操作。

红黑树是非常快速的数据结构,符合上述要求(最后两个需要对结构稍作修改)。

您只需要允许重复键,因为红黑树遵循二叉搜索树的属性。 Here is an example BST 允许重复键

红黑树足以维持以下运行时间:

  • 搜索:O(log N)
  • 插入:O(log N)
  • 删除:O(log N)
  • 空格:O(N)

编辑: 您可以实现Self-Balancing Binary Tree,并进行修改以允许重复键并找到最旧的键(参见上面的参考)。在此基础上,Splay Tree 可以通过 O(log N)

的摊销运行时间满足您的所有要求

寻找FREQ_SUM(S,z)
由于搜索以 O(log N) 的摊销时间运行,并且您正在搜索树中的 2 个节点,因此最终运行时间为 O(2*log N)。但是在考虑运行时,标量常量被忽略了;您的运行时间为 O (log N)。然后找到节点'z',运行时间为O(log N);

这是利用二叉搜索树进行搜索的基本运行时,Splay 树是在该树的基础上构建的。

通过使用 Split 操作,您可以返回两棵新树:一棵包含小于或等于 x 的所有元素,另一棵包含所有大于 x 的元素。

【讨论】:

  • 如何删除O(lg n)时间中最旧的密钥。在红黑树中,我需要知道键的值才能在那时将其删除。有没有办法让我在短时间内找出那个键的值?
  • @TomKlino 我已阅读您的评论并很快更新答案
  • 我可以看到它如何解决大多数的要求,但我看不出如何在时间复杂度为O(lg n) 的这种树上实现FREQ_SUM(S,z)
  • 我认为您并不真正了解 freq_sum(S,z) 的作用。没有节点zz 是树中两个键的频率的目标总和。此外,您不知道两个键的哪个组合(如果有)会产生这样的总和,因此您不知道要查找的键是什么,因此查找的不是O(lg n)。除非你认为我误解了你的解释,否则这个数据结构似乎不符合要求。
  • 如果您要搜索的键不存在,则运行时间将始终高于 O (log N),无需检查某种类型的内置约束。否则你会遇到必须查看所有 N 个节点的情况
猜你喜欢
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2020-10-26
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多