黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 優先隊列的詳解

優先隊列的詳解

更新時間:2021-08-09 16:26:20 來源:動力節點 瀏覽993次

1.優先隊列:

能夠完成以下兩個操作的數據結構叫優先隊列:

可以插入新元素

可以快速取出所有元素的最值。

2.優先隊列的實現:堆

堆是一顆完全二叉樹。

重要的性質:父節點一定是其所有子孫節點的最值。

一個簡單的堆的示意圖如下:

優先隊列

堆的插入:首先在堆的末尾插入該數值,然后不斷向上調整,直到沒有大小顛倒為止

優先隊列

取出最值:最值就在堆頂,即二叉樹的第一個元素。

刪除最值:首先將堆的最后一個元素復雜到根節點,并刪除最后一個元素,然后將根節點不斷向下進行調整直到沒有大小顛倒。

優先隊列

時間復雜度:堆的插入和刪除的時間復雜度為O(l o g?n)O(log?n)O(log?n)

注意:刪除和插入具體的向上/下調整的方法,可以看下面的代碼。

3.代碼

優先隊列的實現:我們知道完全二叉是可以通過簡單的數值實現的,如果我們將完全二叉樹中的每個節點進行編號,編號從1開始,編號順序是從上到下從左到右,然后根據這個編號將樹中的節點存儲到數組中,父子關系可以通過下面方式得到:

假設當前節點的編號(數組中的編號)為i ii,則有:

它的父節點的編號為:i/2 i/2i/2(整除)

它的左兒子節點的編號為:2∗i 2*i2∗i

它的右兒子節點的編號為:2∗i+1 2*i+12∗i+1

//最小堆的實現
#include <iostream>
#define Max_N   1005

using namespace std;

int Heap_size;
int Heap[Max_N];

//插入操作
void push(int x)
{
    int indx=++Heap_size;//首先插入到最后一個位置
    //向上調整
    while(indx>1)//只有i>1才會有父節點
    {
        int parent_indx=indx/2;//父節點編號
        if(Heap[parent_indx]<=x)//沒有上下顛倒就結束調整
            break;
        Heap[indx]=Heap[parent_indx];//大小顛倒就將當前節點上調
        indx=parent_indx;

    }
    Heap[indx]=x;
}

//刪除操作
int pop()
{
    int result=Heap[0];//獲取最值
    int x=Heap[--Heap_size];//相當于將最后的一個元素放到根節點
    int index=1;
    while(2*index<=Heap_size)//一定要有子節點
    {
        int L_son_index=2*index;
        int R_son_index=2*index+1;
        //比較兒子節點的最值
        int Min_index=L_son_index;
        if(R_son_index<=Heap_size && Heap[R_son_index]<Heap[Min_index])
            Min_index=R_son_index;
        //如果沒有上下顛倒就結束
        if(Heap[Min_index]>=x)
            break;
        //上下顛倒就交換
        Heap[index]=Heap[Min_index];
        index=Min_index;
    }
    Heap[index]=x;
    return result;
}

void Build_Heap(int data[],int n)
{
    //創建一個空堆
    Heap_size=0;
    for(int i=0;i<n;i++)//逐個插入元素
        push(data[i]);

}


int main()
{
    int n;
    int data[Max_N];
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>data[i];
    cout<<"使用下面數據構建堆"<<endl;
    for(int i=0;i<n;i++)
        cout<<data[i]<<" ";
    cout<<endl;
    Build_Heap(data,n);
    cout<<"堆中數據:"<<endl;
    for(int i=1;i<=Heap_size;i++)
        cout<<Heap[i]<<" ";
    cout<<endl;
    return 0;
}
/*
9
9 7 10 4 5 19 23 6 7
*/

4.優先隊列的庫:

實際上,大部分情況并不需要自己使用堆來實現優先隊列,我們可以使用C++中,STL里面的priority_queue來實現優先隊列。

以上就是動力節點小編介紹的"優先隊列的詳解",希望對大家有幫助,想了解更多可查看Java教程。動力節點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 亚洲另在线日韩综合色 | 一级大片免费 | 97黄色网 | free性欧美hd粗暴 | 波多野结衣一区二区 | 久久免费区一区二区三波多野 | 免费人成在线观看播放国产 | 日本资源站 | 美国一级做a爰片性色毛片 美国一级做a一级视频 | 欧美日韩免费一区二区在线观看 | 亚洲狠狠干| 日韩欧美亚洲 | 看国产黄色片 | 国产成人综合久久综合 | 中文字幕15页 | a人片在线观看 | 91午夜精品亚洲一区二区三区 | 精品久久久久免费极品大片 | 黄色一级片a | 我要看黄色一级片 | 无遮羞肉体动漫影院免费版 | 香蕉精品一本大道在线观看 | 欧美精品区 | 在线欧美视频免费观看国产 | 一区二区三区四区视频在线 | 日日操狠狠操 | 成人午夜性a一级毛片美女 成人午夜小视频 | 久久亚洲精品成人 | 亚洲欧美视频一区二区三区 | 无限资源日本好片 | 动漫精品一区二区三区视频 | 中文字幕天天躁日日躁狠狠 | 成人影视频 | 成人午夜在线观看 | 丝袜美女在线播放 | 亚洲永久中文字幕在线 | 男人的天堂色偷偷之色偷偷 | 欧美激情亚洲精品日韩1区2区 | 亚洲不卡视频 | 亚洲欧美日韩精品香蕉 | 精品国产品国语在线不卡丶 |