Exemple #1
0
    /// <summary>
    /// 根据指定数组初始化面向中位数的堆。
    /// </summary>
    /// <param name="keys">初始数组。</param>
    public MedianPq(TKey[] keys)
    {
        _minPq = new MinPq <TKey>();
        _maxPq = new MaxPq <TKey>();

        if (keys.Length == 0)
        {
            _n      = 0;
            _median = default;
            return;
        }

        _n      = keys.Length;
        _median = keys[0];
        for (var i = 1; i < keys.Length; i++)
        {
            if (_median.CompareTo(keys[i]) < 0)
            {
                _minPq.Insert(keys[i]);
            }
            else
            {
                _maxPq.Insert(keys[i]);
            }
        }

        UpdateMedian();
    }
Exemple #2
0
 /// <summary>
 /// 构造一个指定容量的面向中位数的堆。
 /// </summary>
 /// <param name="capacity">初始容量。</param>
 public MedianPq(int capacity)
 {
     _maxPq  = new MaxPq <TKey>((capacity - 1) / 2);
     _minPq  = new MinPq <TKey>((capacity - 1) / 2);
     _n      = 0;
     _median = default;
 }
Exemple #3
0
 /// <summary>
 /// 默认构造函数,构造一个面向中位数的堆。
 /// </summary>
 public MedianPq()
 {
     _maxPq  = new MaxPq <TKey>();
     _minPq  = new MinPq <TKey>();
     _median = default;
     _n      = 0;
 }
Exemple #4
0
    /// <summary>
    /// 根据已有元素建立一个最大-最小堆。(O(n))
    /// </summary>
    /// <param name="keys">需要建堆的元素。</param>
    public MinMaxPq(TKey[] keys)
    {
        _n = keys.Length;
        var minNodes = new MinMaxNode[keys.Length];
        var maxNodes = new MinMaxNode[keys.Length];

        for (var i = 0; i < _n; i++)
        {
            MinMaxNode.GetNodes(keys[i], i + 1, out minNodes[i], out maxNodes[i]);
        }
        _minPq = new MinPq(minNodes);
        _maxPq = new MaxPq(maxNodes);
    }
    /// <summary>
    /// 获取堆的迭代器,元素以降序排列。
    /// </summary>
    /// <returns>最大堆的迭代器。</returns>
    public IEnumerator <TKey> GetEnumerator()
    {
        var copy = new MaxPq <TKey>(N);

        for (var i = 1; i <= N; i++)
        {
            copy.Insert(Pq[i]);
        }

        while (!copy.IsEmpty())
        {
            yield return(copy.DelMax()); // 下次迭代的时候从这里继续执行。
        }
    }
Exemple #6
0
 /// <summary>
 /// 构造一个指定容量的最大-最小堆。
 /// </summary>
 /// <param name="capacity">堆的大小。</param>
 public MinMaxPq(int capacity)
 {
     _minPq = new MinPq(capacity);
     _maxPq = new MaxPq(capacity);
     _n     = 0;
 }