最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C++構(gòu)建一個(gè)優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)

 更新時(shí)間:2025年02月06日 09:04:16   作者:zhoudeng666  
優(yōu)先級(jí)隊(duì)列是一種特殊的隊(duì)列數(shù)據(jù)結(jié)構(gòu),本文主要介紹了使用C++構(gòu)建一個(gè)優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.優(yōu)先級(jí)隊(duì)列的介紹

優(yōu)先級(jí)隊(duì)列是一種特殊的隊(duì)列數(shù)據(jù)結(jié)構(gòu),它是隊(duì)列,但又不完全是,因?yàn)樗獙⒀b載的數(shù)據(jù)進(jìn)行優(yōu)先級(jí)排序,找到一個(gè)最大或者最小優(yōu)先級(jí)的元素,下一次出隊(duì)列的元素就是這個(gè)元素,所以說(shuō)它不完全是一個(gè)隊(duì)列,優(yōu)先級(jí)隊(duì)列廣泛應(yīng)用于任務(wù)調(diào)度、資源分配、事件處理、Dijkstra算法、A*搜索算法等領(lǐng)域。

2.優(yōu)先級(jí)隊(duì)列的設(shè)計(jì)

 個(gè)人感覺(jué),設(shè)計(jì)一個(gè)優(yōu)先級(jí)隊(duì)列就是一個(gè)堆建立和調(diào)整的過(guò)程,因?yàn)橐b載元素,所以我們采用vector來(lái)作為成員變量,后續(xù)就是對(duì)與這個(gè)vector變量的管理就行了,因?yàn)槲覀冎皇呛?jiǎn)單設(shè)計(jì)一個(gè)優(yōu)先級(jí)隊(duì)列,所以并沒(méi)有設(shè)計(jì)在優(yōu)先級(jí)隊(duì)列中傳入函數(shù)進(jìn)行比較的過(guò)程,只是簡(jiǎn)單的比較大小的過(guò)程,首先我們要設(shè)計(jì)向上調(diào)整函數(shù)和向下調(diào)整函數(shù),因?yàn)檫@個(gè)的構(gòu)造函數(shù)和析構(gòu)函數(shù)非常簡(jiǎn)單,這里我就不過(guò)多贅述了。

向上調(diào)整函數(shù)

向上調(diào)整函數(shù)就是子節(jié)點(diǎn)與父節(jié)點(diǎn)做比較,這里我們假設(shè)建小堆,如果子節(jié)點(diǎn)小于父節(jié)點(diǎn),那么這個(gè)堆就是有問(wèn)題的,所以要進(jìn)行交換,將子節(jié)點(diǎn)與父節(jié)點(diǎn)進(jìn)行交換,但是我們又要考慮交換以后得子節(jié)點(diǎn)也就是現(xiàn)在的父節(jié)點(diǎn)是否和他現(xiàn)在的父節(jié)點(diǎn)又是不對(duì)的關(guān)系的,所以我們要進(jìn)行循環(huán),只有當(dāng)節(jié)點(diǎn)為0,也就是根節(jié)點(diǎn)或者,子節(jié)點(diǎn)小于父節(jié)點(diǎn)時(shí),進(jìn)行循環(huán)退出

void siftUp(size_t index)
{
    
    while (index > 0)
    {
        int father = index / 2;
        
        if (list[father] > list[index])
        {
            swap(list[father], list[index]);
            index = father;
        }
        else
        {
            break;
        }
    }
}

向下調(diào)整函數(shù)

向下調(diào)整就是判斷你是否比你的兩個(gè)孩子都要小,邏輯和向上調(diào)整函數(shù)差不多,只是要和兩個(gè)孩子都比一次,或者找最小的那個(gè)孩子比,主要是要知道孩子是index/2-1和index/2-2就行

void siftDown(size_t index)
{
    while (index <= list.size())
    {
        leftson = index * 2 + 1;
        rightson = index * 2 + 2;
        if (list[index] > list[leftson])
        {
            swap(list[index], list[leftson])
                index = leftson;
        }
        else if (list[index] > list[rightson])
        {
            swap(list[index], list[rightson]);
            index = rightson;
        }
        else
        {
            break;
        }
    }
}

建堆函數(shù)

在構(gòu)造函數(shù)的第一步肯定是拷貝構(gòu)造對(duì)應(yīng)的vector,然后得到的這個(gè)vector大概率不是一個(gè)堆,因此要對(duì)它進(jìn)行調(diào)整,使得它可以成為一個(gè)符合規(guī)則的堆,一般建堆有兩種策略,一種是自下而上的sift down方法,另一種是自上而下的sift up方法。這里我們使用sit down 向下調(diào)整的方法,找到最后一個(gè)非葉子節(jié)點(diǎn),也就是list.size()/2,然后對(duì)每個(gè)非葉子節(jié)點(diǎn)進(jìn)行向下調(diào)整

explicit Heap(const std::vector<T>& array)
    :list(array)
{
    buildHeap();
}
void buildHeap()
{
    for (int i = list.size() / 2 ; i >=0  ; i--)
    {
        siftDown(i);
   }
}

插入函數(shù)

當(dāng)我們插入一個(gè)元素時(shí),我們首先是尾插入vector列表,然后對(duì)這個(gè)元素進(jìn)行向上調(diào)整,就使得這個(gè)堆變得規(guī)則

void insert(const T& value)
{
    list.insert(value);
    siftUp(list.size() - 1);
}

獲取頂端元素函數(shù)

我們建立這個(gè)堆或者說(shuō)維護(hù)這個(gè)優(yōu)先級(jí)隊(duì)列肯定是為了得到一個(gè)有價(jià)值的元素,所有這個(gè)堆里面最有價(jià)值的元素當(dāng)然時(shí)堆頂元素,但是當(dāng)我們得到堆頂元素時(shí),這個(gè)堆也會(huì)被破壞,所以,我們一般會(huì)將堆頂元素和最后一個(gè)元素進(jìn)行交換,然后再對(duì)堆頂元素進(jìn)行向下調(diào)整,就讓堆保持合適的規(guī)則

void removeTop()
{
    if (list.empty()) {
        throw std::out_of_range("Heap is empty");
    }
    swap(list[0], list[list.size() - 1]);
    siftDown(0);
    list.erase(list.end() - 1);
}

到此這篇關(guān)于使用C++構(gòu)建一個(gè)優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++ 優(yōu)先級(jí)隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++數(shù)組放在main函數(shù)內(nèi)外的區(qū)別

    C++數(shù)組放在main函數(shù)內(nèi)外的區(qū)別

    大家好,本篇文章主要講的是C++數(shù)組放在main函數(shù)內(nèi)外的區(qū)別,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 利用C語(yǔ)言將點(diǎn)分十進(jìn)制的IP字符串轉(zhuǎn)成4個(gè)整數(shù)

    利用C語(yǔ)言將點(diǎn)分十進(jìn)制的IP字符串轉(zhuǎn)成4個(gè)整數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)將點(diǎn)分十進(jìn)制的IP字符串轉(zhuǎn)成4個(gè)整數(shù),文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • C++實(shí)現(xiàn)獲取時(shí)間戳和計(jì)算運(yùn)行時(shí)長(zhǎng)

    C++實(shí)現(xiàn)獲取時(shí)間戳和計(jì)算運(yùn)行時(shí)長(zhǎng)

    這篇文章主要為大家詳細(xì)介紹了如何使用C++實(shí)現(xiàn)獲取時(shí)間戳和計(jì)算運(yùn)行時(shí)長(zhǎng)功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2024-12-12
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單學(xué)生選課管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單學(xué)生選課管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單學(xué)生選課管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C++?函數(shù)的介紹

    C++?函數(shù)的介紹

    本篇主要介紹了函數(shù)的基礎(chǔ)概念以及一些特殊的函數(shù)方法和類型,函數(shù)重載以及函數(shù)指針,下面一起進(jìn)入文章學(xué)習(xí)詳細(xì)的內(nèi)容吧,需要的朋友也可以參考一下
    2021-12-12
  • C++11語(yǔ)法之右值引用的示例講解

    C++11語(yǔ)法之右值引用的示例講解

    右值引用,一般是在深拷貝的類,實(shí)現(xiàn)移動(dòng)構(gòu)造和移動(dòng)賦值,能夠解決左值引用無(wú)法做到的傳返回值的效率問(wèn)題,下面跟隨小編一起學(xué)習(xí)下C++11語(yǔ)法之右值引用的問(wèn)題
    2022-04-04
  • C++ OpenCV生成蒙太奇圖像的示例詳解

    C++ OpenCV生成蒙太奇圖像的示例詳解

    圖片的蒙太奇效果,一般稱為馬賽克圖。由很多小圖拼接成一個(gè)大圖。這篇文章主要為大家介紹如何利用C++ OpenCV實(shí)現(xiàn)生成蒙太奇圖像,感興趣的可以了解一下
    2022-01-01
  • 使用C++開(kāi)發(fā)一個(gè)串口讀寫(xiě)軟件的實(shí)現(xiàn)步驟

    使用C++開(kāi)發(fā)一個(gè)串口讀寫(xiě)軟件的實(shí)現(xiàn)步驟

    這篇文章主要介紹了使用xmake(一個(gè)項(xiàng)目管理工具兼包管理工具)和asio2(一個(gè)asio的框架,可以實(shí)現(xiàn)輕松各種網(wǎng)絡(luò)應(yīng)用,一般支持tcp,udp,http,websocket,rpc,ssl,icmp,serial_port.)來(lái)快速的開(kāi)發(fā)個(gè)串口讀寫(xiě)軟件(整合例程),需要的朋友可以參考下
    2025-04-04
  • C++實(shí)現(xiàn)掃雷、排雷小游戲

    C++實(shí)現(xiàn)掃雷、排雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)掃雷、排雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 使用C語(yǔ)言訪問(wèn)51單片機(jī)中存儲(chǔ)器的核心代碼

    使用C語(yǔ)言訪問(wèn)51單片機(jī)中存儲(chǔ)器的核心代碼

    這篇文章主要介紹了使用C語(yǔ)言訪問(wèn)51單片機(jī)中存儲(chǔ)器的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01

最新評(píng)論

荔浦县| 龙门县| 格尔木市| 韶关市| 蓬莱市| 大同市| 宁国市| 天等县| 洱源县| 沙湾县| 肇源县| 莲花县| 仙游县| 阳江市| 利津县| 岳阳县| 乌兰浩特市| 裕民县| 西华县| 吕梁市| 华宁县| 安仁县| 通辽市| 会同县| 连云港市| 海安县| 邛崃市| 阳东县| 和顺县| 岚皋县| 当雄县| 美姑县| 沭阳县| 修武县| 永仁县| 磐安县| 阿图什市| 乐东| 萨嘎县| 龙井市| 高碑店市|