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

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

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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 精品一区 二区三区免费毛片 | 日韩高清中文字幕 | 成人播放 | 青青青国产精品手机在线观看 | 免看一级a一片成人123 | 97影院秋霞国产精品 | 国产一区免费在线观看 | 免费在线黄视频 | 美女乱人伦 | 午夜在线视频网站 | 97欧美在线看欧美视频免费 | 三级欧美日韩 | 黄色免费在线观看 | 日本黄色片网站 | 国产区精品高清在线观看 | 久久久国产亚洲精品 | 成人涩 | 黄色网址免费看 | 欧美八区| 亚洲综合精品一二三区在线 | 亚洲激情综合在线 | 亚洲精品免费在线视频 | 亚洲欧美日韩国产精品网 | 亚洲午夜精品aaa级久久久久 | 国产女人的一级毛片视频 | 亚洲aⅴ久久久噜噜噜噜 | 亚洲高清毛片 | www亚洲天堂 | 舔插视频| 日本福利网站 | 国产无内制服肉丝精品视频 | 日韩在线aⅴ免费视频 | 日韩在线第一区 | 日本中文字幕精品理论在线 | 午夜视频在线观看按摩女 | 亚洲玖玖 | 成人狠狠色综合 | 真实国产精品视频国产网 | 日韩在线视频免费 | 精品国产高清自在线一区二区三区 | 久久天天躁狠狠躁夜夜2020一 |