大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

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

優先隊列的詳解

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

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編程,感興趣的同學可以關注一下。

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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产精品五月天 | 一级欧美一级日韩毛片99 | 精品视频自拍 | 中国一级毛片免费观看 | 天天做天天做天天综合网 | 日日摸夜夜摸人人嗷嗷叫 | 亚洲欧美日韩v中文在线 | 欧美成人全部免费观看1314色 | 99福利| 欧美亚洲激情 | 久青草视频免费观看青 | 欧美日日射| 91亚洲精品福利在线播放 | 久久精品五月天 | 在线免费观看亚洲 | 久久久久嫩草影院精品 | 男人av的天堂 | 日本欧美一区二区三区在线观看 | 日韩精品亚洲精品485页 | 日本一级毛片免费播 | 精品久久免费观看 | h片在线播放免费高清 | 亚洲精品欧美一区二区三区 | 一级特黄aa大片一又好看 | 性欧美xo视频在线观看 | 色日韩 | 六月婷婷啪啪 | 天天躁日日躁狠狠躁中文字幕 | 69久成人做爰视频 | 老外黑人欧美一级毛片 | 欧美精品blacked中文字幕 | 黄色免费毛片 | 日日噜噜夜夜狠狠tv视频免费 | 在线亚洲免费 | 性做久久久久久坡多野结衣 | 久久久91| 亚洲国产综合精品中文字幕 | 亚洲精品久久一区影院 | 亚洲乱码一区二区三区在线观看 | 久久机热re这里只有精品15 | 五月激情丁香婷婷综合第九 |