我正在寻找一种数据结构,该结构可以解决O(n * log(n))复杂性的特定问题。它需要代表一组整数,在其中我可以执行以下操作: -添加元素 -检查元素是否存在于集合中 -删除每个大于给定整数的值 希望具有对数复杂性。
我正在寻找链接列表,因为在中间添加元素并删除结构的整个部分很容易,但是我不知道如何保留有序列表或实现二分法搜索。起初,我在考虑哈希表,但不知道如何过滤该集合。我正在查看平衡的二叉树,我不知道我是否在寻找某种幻想,或者它是否以某种方式存在,而我却找不到。
答案 0 :(得分:0)
对于从头开始实施,我建议使用Treap。
Treap只是一个二叉搜索树,每个节点都有一个随机优先级,它满足了作为树的堆条件。这种随机数据结构使查找,插入,删除和拆分树的预期时间为O(log(n))
。前三个非常简单。要进行拆分,您只需在节点上放置一个要比根节点更高优先级的节点。然后一半缠绕在该节点的一侧,另一半缠绕在另一侧。
请注意,虽然拆分为O(log(n))
,但释放已删除的位为O(n)
。
请注意,您可能不必执行任何操作。例如,在C ++中,您可以仅使用std::map
。除删除外,这些操作的性能为O(log(n))
。从大小为m
的结构中删除长度为n
的范围是O(m + log(n))
。如果您考虑有关释放内存的评论,那是理想的选择。