通过高效的插入/查找Kth最小操作实现数据结构



面试官问我这个问题。我尝试使用数组解决它,这样我就可以确保插入时数组排序。但是,我认为这不是最好的解决方案。这个问题的好解决方案是什么?

您可以使用Balenced Binary Search Tree(例如:红黑bst(。

  • 只需将节点插入平衡的 bst.,每个节点在其自己的子树中保持其等级。由于我们需要找到最小的元素,我们可以在左子树中维护元素计数。

  • 现在,从根开始遍历并检查:

    • 如果 k = N +1,其中 N 是根左子树中的节点数。 如果是,则根是第 k 个节点。

    • 否则,如果 K <N,则继续在根的左侧子树中搜索。>

    • 否则,如果 k> N +1,则继续在右侧子树中搜索。并搜索 (K-N-1( 最小元素。

平衡bst中insertion的时间复杂度为O(logn(。在搜索第 k 个最小元素时,最小元素将是 O(h(,其中 h 是树的高度。

您可以使用订单统计树。从本质上讲,它是一个自平衡的二叉搜索树,其中每个节点还存储其子树的基数。保持基数不会增加任何树操作的复杂性,但允许在 O(logn( 时间内执行查询:

  • 如果左侧子树的基数>k,则在左侧子树上递归。
  • 否则,如果左侧子树的基数<<em>k,则在右侧子树上递归。
  • 否则,左子树的基数等于k,因此返回当前节点的元素。

最新更新