具有最小值,最旧值和关键频率的数据结构

时间:2015-07-12 14:36:32

标签: algorithm data-structures time-complexity

我正在处理数据结构中的测试问题,我需要建议一个符合以下要求的数据结构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):以最大频率返回密钥(大多数 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可能是一个可能的答案,因为结构中存在3次,5次存在2次,所以3+2=z

1 个答案:

答案 0 :(得分:-1)

您可以使用Red-Black来完成此任务。

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

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

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

  • 搜索:O(日志N)
  • 插入:O(日志N)
  • 删除:O(日志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树的。

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