我正在处理数据结构中的测试问题,我需要建议一个符合以下要求的数据结构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
答案 0 :(得分:-1)
您可以使用Red-Black来完成此任务。
红黑树是非常快速的数据结构,符合您上面提到的要求(最后两个需要对结构稍作修改)。
您只需要允许重复键,因为红黑树遵循二叉搜索树的属性。允许重复密钥的BST的Here is an example
红黑树足以维持以下的运行时间:
修改强> 您可以实施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的元素。