zoukankan      html  css  js  c++  java
  • 算法导论 6.5-8

    实现一个O(lgn)的最大堆优先队列的delete操作。

    Heap-Delete(A,i)操作能够将节点i从对中A删除。

    代码说明:假如删除序号为i的节点,那么我们先把最后的节点,放到i中去,然后对i进行堆维护,即向下维护堆,然后此时得到的序号为i的值向下能满足堆的性质,但向上不一定可以,所以我们再向上维护堆。这样完成后就可以了。应为向上向下加起来刚好是h,所以时间复杂度为O(lgn)。

    #include<iostream>
    
    using namespace std;
    
    #define Left(i)    i*2+1
    #define Right(i) i*2+2
    #define Parent(i) (i-1)/2
    
    int size = 10;
    
    
    
    void MaxHeapInsertKey(int a[], int i)
    {
        if (Parent(i) >= 0 && a[Parent(i)] < a[i])
        {
            int temp = a[Parent(i)];
            a[Parent(i)] = a[i];
            a[i] = temp;
            MaxHeapInsertKey(a, Parent(i));
        }
    }
    
    void MaxHeap(int a[], int i)
    {
        int L = Left(i);
        int R = Right(i);
        int largest = i;
        if (L<size&&a[L]>a[largest])
        {
            largest = L;
        }
        if (R<size&&a[R]>a[largest])
        {
            largest = R;
        }
        if (largest != i)
        {
            int temp = a[largest];
            a[largest] = a[i];
            a[i] = temp;
            MaxHeap(a, largest);
        }
    }
    
    int HeapDelete(int a[], int i)
    {
        int temp;
        temp = a[i];
        a[i] = a[size - 1];
        size--;
        MaxHeap(a, i);
        MaxHeapInsertKey(a, i);
        return temp;
    }
    
    int main()
    {
        int a[] = { 16, 4, 10, 14, 7, 9, 3, 2, 8, 1 };
        HeapDelete(a, 1);
        for (int i = 0; i < size; i++)
            cout <<a[i]<<"    ";
    }
  • 相关阅读:
    关于Python中的yield
    Python的getattr(),setattr(),delattr(),hasattr()
    django Forgienkey字段 在前台用js做处理
    利用checkbox的到值,并且存到数据库修改的话要显示之前选择的
    关于django批量上传图片
    block extends include三者的差别跟用法
    全智能建造
    共享经济
    新工匠
    运营方案
  • 原文地址:https://www.cnblogs.com/chaiwentao/p/4306965.html
Copyright © 2011-2022 走看看