是否可以构建二叉树并跟踪中位数,仍然使用O(log(n))插入?

时间:2017-01-29 07:04:39

标签: c# .net algorithm data-structures

我试图弄清楚这是否可行。

我尝试算法:

m1,m2是中间2个元素(如果树的大小是奇数,那么m1=m2)。

这是构建树的样子

----------------------------------
           5 = m1,m2
----------------------------------
           5 = m2
          /
         2 = m1
-----------------------------------
          5 
         /
        2 = m1,m2
       /
      1
-----------------------------------  
          5 
         /
        2 = m1
       / \ 
      1   3 = m2
-----------------------------------
          5
         / \
        2   9 
       / \ 
      1   3 = m1,m2
-----------------------------------
          5 = m2
         /  \
        2    9 
       / \   /
      1   \ 6   
           \
           3 = m1   

我开始尝试实施方法

    /// <summary>
    /// Insert an element
    /// </summary>
    public void Insert(int val)
    {
        // If inserting first element, set _m1 and _m2.
        if(_root == null)
        {
            _m1 = _m2 = val;
        }

        // Insert new node in proper spot in tree.
        Node cur = _root;           
        while(cur != null)
        {
            if(cur.Val > val)
                cur = cur.Left;
            else if(cur.Val < val)
                cur = cur.Right;
            else // found value on an existing node
                return;
        }
        cur = new Node() { Val = val };

        // Update median elements
        if(val < _m1.Val)
        {
            // ???
        }
        else if(val > _m2.Val)
        {
            // ???
        }
    }       
}

但我无法弄清楚如何更新中位数。甚至可以做O(1)时间吗?

1 个答案:

答案 0 :(得分:1)

如果你将你的树变成order statistics treesee also),你可以在O(树高)中查找中位数,所以o(log(n))如果树是平衡的

要跟踪中位数,只要修改树,就可以简单地执行中位数查找。

要将树变为订单统计树,您需要为节点内的每个节点存储和更新后代的nuber及其值。

有人在this related answer发布了一个c# - 实现这样一棵树。