欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STL中的堆算法該如何使用呢?

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:暮回_zz ? 2023-04-19 16:42 ? 次閱讀

堆結(jié)構(gòu)簡述

了解過數(shù)據(jù)結(jié)構(gòu)的人,應(yīng)該對(duì)堆結(jié)構(gòu)不陌生,堆的底層是使用數(shù)組來實(shí)現(xiàn)的,但卻保持了二叉樹的特性。堆分為兩種,最大堆和最小堆,以最大堆為例,最大堆保持了根結(jié)點(diǎn)大于兩個(gè)左右兩個(gè)孩子,同時(shí)所有子樹一次類推。由于堆底層是數(shù)組結(jié)構(gòu),這里從跟結(jié)點(diǎn)開始,按照層序依次走到最后一個(gè)結(jié)點(diǎn),結(jié)點(diǎn)下標(biāo)分貝為0~N-1。結(jié)構(gòu)如下圖:

d5058e90-de8d-11ed-bfe3-dac502259ad0.png

上圖中,紫色表示的是該元素在數(shù)組中的下標(biāo),可以看到,每個(gè)結(jié)點(diǎn)的值總是大于它的左右孩子,這里并沒有規(guī)定左右孩子的大小關(guān)系,也沒有規(guī)定不是同一棵樹之間結(jié)點(diǎn)的大小關(guān)系。這就是最大堆。同時(shí)這里可以注意到,如果是大堆,根節(jié)點(diǎn)一定是樹中最大的結(jié)點(diǎn),同樣,如果是小堆,根節(jié)點(diǎn)一定是樹中最小的結(jié)點(diǎn)。

堆結(jié)構(gòu)在排序領(lǐng)域,占據(jù)著一定的低位,但是STL中并沒有直接給出堆結(jié)構(gòu),而是把堆的相關(guān)算法,寫在了 algorithm 里面。在這里我不會(huì)過多的去模擬實(shí)現(xiàn)一個(gè)堆,今天要說的是關(guān)于STL中給出的堆算法如何使用。

algorithm 中的堆算法

在STL中,關(guān)于堆,給出了一下幾種算法。

★make_heap

★push_heap

★pop_heap

★sort_heap

這里,首先給出一個(gè)利用STL中堆算法的實(shí)例

#include   
#include   
void test()  
{  
  int arr[] = {1,2,3,4,5,6,7};  
  vector vec(arr, arr+7);     // 左開右閉類型  
  make_heap(vec.begin(), vec.end());  // 默認(rèn)建大堆  
  pop_heap(v1.begin(), v1.end());     
  v1.pop_back();             
  sort_heap(vec.begin(), vec.end());  // 堆排序  
  for(size_t i = 0; i < vec.size(); i++) ? 
 ? ? ? ?cout<

上面代碼,首先用一個(gè)數(shù)組構(gòu)建了一個(gè)向量,之后對(duì)向量vec建堆,pop出調(diào)整之后的向量中第一個(gè)元素,并進(jìn)行調(diào)整,然后進(jìn)行堆排序,最后將結(jié)果打印出來,打印結(jié)果如下:

d516c020-de8d-11ed-bfe3-dac502259ad0.png

看完了heap算法的基本使用,現(xiàn)在,我們了解一下,STL中是如何提供這些算法接口的。

1、make_heap

d52d72f2-de8d-11ed-bfe3-dac502259ad0.png

前面提到過,堆分為大堆和小堆,我們建立堆的時(shí)候就需要確定,但剛剛例子中,我們并沒有去指定大小堆。STL中規(guī)定,沒有指定的話,默認(rèn)大堆結(jié)構(gòu)。從上面關(guān)于make_heap的兩套接口可以看到,第一種是默認(rèn)的,沒有提供指定大小堆的接口,第二種這里有實(shí)現(xiàn)。我們可通過仿函數(shù)的結(jié)構(gòu),實(shí)現(xiàn)這里的傳參。

對(duì)剛剛給出的例子,我們現(xiàn)在可以解釋另外一個(gè)問題,為什么我們要進(jìn)行堆排序,首先要構(gòu)建vector呢?因?yàn)槎训牡讓訉?shí)現(xiàn)就是通過數(shù)組的形式,而vector是堆數(shù)組的高級(jí)封裝,這些庫中實(shí)現(xiàn)好的容器給出了很多實(shí)用的接口和迭代器,使用起來的確可以方便不少。make_heap給出的接口中,前兩個(gè)是任意類型的迭代器(當(dāng)然,這里也可以直接傳遞數(shù)組的指針),不論是make_heap還是其他三個(gè)函數(shù),這里的迭代器區(qū)間總是左閉右開的,這是個(gè)需要注意的地方。

接下來我們來介紹仿函數(shù)這里的實(shí)現(xiàn)。還是上面的例子,如何讓上面剪子一個(gè)最小堆呢?

//仿函數(shù)結(jié)構(gòu):

struct Compare
{
bool operator()(int num1, int num2)
{
return num1 > num2;
}
};

// 建堆時(shí),參數(shù)傳遞改為

make_heap(vec.begin(), vec.end() , Compare());  // 建小堆

注意,上面我寫的是num1 > num2,這樣建出來頂點(diǎn)是小堆。關(guān)于make_heap就說到這里。

2、push_heap與pop_heap

push表示的是向vector中插入一個(gè)元素,但這里它并不是直接插入元素,準(zhǔn)確的說,它的功能只是做調(diào)整,在push_heap之前,首先需要調(diào)用vec.push_back(x),向vector尾部插入一個(gè)元素,然后在調(diào)用push_heap函數(shù)進(jìn)行調(diào)整,使得整個(gè)樹重新滿足堆結(jié)構(gòu)。

pop_heap與push_heap類似,同樣沒有直接改變vector中元素個(gè)數(shù)的能力。對(duì)于堆而言,pop要做的是將vector的第一個(gè)元素扔出去,為了不直接破壞樹的結(jié)構(gòu),這里先調(diào)用pop_heap函數(shù),將堆中的最大值或最小值放到vector的尾部,同時(shí)進(jìn)行一次調(diào)整,使得堆結(jié)構(gòu)依然成立,然后調(diào)用vec.pop+back()函數(shù),將最后一個(gè)元素從vector中剔除。

這就是插入和刪除的整個(gè)過程。

3、sort_heap

顧名思義,sort_heap就是進(jìn)行堆排序的意思,對(duì)堆結(jié)構(gòu)進(jìn)行排序,得到的結(jié)果就是vector中的元素變得有序。這里,構(gòu)建大堆,排序結(jié)果是升序的,構(gòu)建小堆,得到的排序結(jié)果是降序的。

上面就是關(guān)于堆排序的基本算法,關(guān)于C++11新引入的兩個(gè)函數(shù),這里不做討論。

關(guān)于STL中的堆結(jié)構(gòu),這里有幾點(diǎn)還是需要注意的:

1、因?yàn)槎呀Y(jié)構(gòu),是建立在vector上的結(jié)構(gòu),所以如果要進(jìn)行堆排序,整個(gè)過程中至少一次建堆(make_heap)的過程。

2、當(dāng)建堆完成之后,如果再向vector中插入元素,需要調(diào)用 push_heap(v1.begin(), v1.end())進(jìn)行一次向上調(diào)整;如果從vector中Pop出一個(gè)元素,需要調(diào)用 pop_heap(v1.begin(), v1.end())進(jìn)行一次向下調(diào)整。

如果沒有調(diào)整,當(dāng)調(diào)用 sort_heap(v1.begin(), v1.end())函數(shù)的過程中,會(huì)出現(xiàn)由于堆不合法引起的斷言錯(cuò)誤。

3、不可以讓vector多次尾插,之后再多次向上調(diào)整,會(huì)造成堆混亂,排序時(shí)也會(huì)出現(xiàn)斷言錯(cuò)誤。當(dāng)然,多次插入或刪除之后,可以再次進(jìn)行重新建堆,只不過消耗的時(shí)間代價(jià)會(huì)比較大。

堆結(jié)構(gòu)實(shí)際應(yīng)用

接下來,看一道面試題:

CVTE:統(tǒng)計(jì)公司員工最喜歡吃的前K種水果

有過上面的基礎(chǔ),我這里直接給出demo

#include   
#include   
#include   
#include   

struct Min  
{  
      bool operator()(pair p1, pair p2)  
      {  
            return p1.second > p2.second;  
      }  
};  
void HeapSort()  
{  
      vector v1 = { "蘋果", "香蕉", "蘋果"  
            , "蘋果", "蘋果", "香蕉"  
            , "蘋果", "獼猴桃", "草莓" };  
      map fruit;  

      //用map統(tǒng)計(jì)次數(shù)  
      for (size_t i = 0; i < v1.size(); i++) ? 
 ? ? ? ? ? ?{ ? 
 ? ? ? ? ? ? ? ? ? ? ? ?fruit[v1[i]]++; ? 
 ? ? ? ? ? ?} ? 

 ? ? ? ? ? ?// 用heap排序 ? 
 ? ? ? ? ? ?vector> vec;  
      map::iterator it = fruit.begin();  
      //while (it != fruit.end())  
      //{  
      //     vec.push_back(pair(it->first, it->second));  
      //     it++;  
      //}  
      vec.insert(vec.begin(), fruit.begin(), fruit.end());  
      make_heap(vec.begin(), vec.end(), Min());  
      sort_heap(vec.begin(), vec.end(), Min());  
      int K = 3;  
      for (size_t i = 0; (i < K) && (i < vec.size()); i++) ? 
 ? ? ? ? ? ?{ ? 
 ? ? ? ? ? ? ? ? ? ? ? ?cout << vec[i].first <<"--"<

堆排序是數(shù)據(jù)結(jié)構(gòu)中一塊很重要的內(nèi)容,如果是在實(shí)際開發(fā)中,更加推薦的是熟悉STL中給出的算法,正如上文講到的內(nèi)容。如果是對(duì)于初學(xué)者,這里還是推薦對(duì)堆結(jié)構(gòu)和算法的底層實(shí)現(xiàn)有一個(gè)更加深刻的認(rèn)識(shí),對(duì)于堆的調(diào)整算法,不可否認(rèn),是數(shù)據(jù)結(jié)構(gòu)中較為重要的一部分。下一次,會(huì)對(duì)堆結(jié)構(gòu)進(jìn)行模擬實(shí)現(xiàn),更加深入地了解底層結(jié)構(gòu)。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STL
    STL
    +關(guān)注

    關(guān)注

    0

    文章

    86

    瀏覽量

    18398
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7037
  • STL算法
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    5399
  • 迭代器
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    4351

原文標(biāo)題:淺析STL算法中的堆排序

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++之STL算法(二)

    C++之STL算法(二)
    的頭像 發(fā)表于 07-18 14:49 ?1135次閱讀
    C++之<b class='flag-5'>STL</b><b class='flag-5'>算法</b>(二)

    c++之STL算法(三)

    c++之STL算法(三)
    的頭像 發(fā)表于 07-18 15:00 ?1392次閱讀
    c++之<b class='flag-5'>STL</b><b class='flag-5'>算法</b>(三)

    effective stl中文版下載pdf

    導(dǎo)讀你已經(jīng)熟悉了STL。你知道怎么建立容器,迭代它們的內(nèi)容,添加刪除元素和應(yīng)用常見算法,比如find和sort。但你并不滿足,你不能擺脫STL所提供的超過它們能帶來的好處
    發(fā)表于 08-25 17:47 ?0次下載

    C++ STL的概念及舉例

      本篇文章是作者本人使用STL 后的一些看法, 對(duì)於想要靠此文章學(xué)習(xí)STL, 是不可能的. 建議叁后面介紹的一些書入門.   STL的概念   在STL
    發(fā)表于 08-30 11:39 ?1423次閱讀

    基于STL轉(zhuǎn)換為X3D格式的研究

    通過對(duì)STL三角網(wǎng)格模型和X3D語法規(guī)范的分析與研究,根據(jù)X3D對(duì)三角形的相關(guān)定義和描述,提出了一種將STL三角網(wǎng)格模型轉(zhuǎn)換為X3D格式的算法。該算法在實(shí)現(xiàn)將
    發(fā)表于 01-15 17:04 ?0次下載

    STL算法在GIS的應(yīng)用

    使用STL 算法實(shí)現(xiàn)GIS 算法可以保證它的簡潔和高效該文結(jié)合C++代碼實(shí)例抽象出了地理算子的概念應(yīng)用在GIS 算法當(dāng)中通過定制適配器來消除地理算子和
    發(fā)表于 06-28 16:55 ?33次下載

    基于STL曲面網(wǎng)格重建算法

    快速獲得完整拓?fù)潢P(guān)系且其存在大量冗余信息的缺點(diǎn),制約了STL網(wǎng)格模型的進(jìn)一步優(yōu)化處理與應(yīng)用.為此,需要針對(duì)STL網(wǎng)格模型進(jìn)行網(wǎng)格重建.針對(duì)2維流形的STL三角形曲面網(wǎng)格模型,提出了一種快速的網(wǎng)格重建方法.主要利用刪除在重建過程
    發(fā)表于 12-25 11:52 ?1次下載
    基于<b class='flag-5'>STL</b>曲面網(wǎng)格重建<b class='flag-5'>算法</b>

    C語言教程:STL-for-each算法

    C語言教程:STL-for-each算法(電源技術(shù)版面費(fèi)5400)-文檔為C語言教程:STL-for-each算法總結(jié)文檔,是一份不錯(cuò)的參考資料,感興趣的可以下載看看,,,,,,,,,
    發(fā)表于 09-17 12:42 ?3次下載
    C語言教程:<b class='flag-5'>STL</b>-for-each<b class='flag-5'>算法</b>

    STL的概述

    C++ STL 是一套功能強(qiáng)大的 C++ 模板類,提供了通用的模板類和函數(shù),這些模板類和函數(shù)可以實(shí)現(xiàn)多種流行和常用的算法,關(guān)于 STL ,下面通過一個(gè)系統(tǒng)框圖來對(duì)其進(jìn)行一個(gè)總結(jié)
    的頭像 發(fā)表于 01-20 17:08 ?1467次閱讀
    <b class='flag-5'>STL</b>的概述

    什么是STL?

    STL主要是由一些模板函數(shù)和模板類構(gòu)成的,其包含了C++程序開發(fā)中一些非常通用的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)與算法封裝,從而達(dá)到了非常良好的軟件復(fù)用和擴(kuò)展能力,當(dāng)然其背后帶來的是應(yīng)用程序開發(fā)的高效,你不用再去徒手編輯各種數(shù)據(jù)結(jié)構(gòu)和算法來使用,其
    的頭像 發(fā)表于 02-21 11:08 ?4447次閱讀
    什么是<b class='flag-5'>STL</b>?

    博途使用STL的MOVE指令

    現(xiàn)在,在 S7-1500 CPU 上可使用 STL 的 MOVE 指令進(jìn)行編程。
    的頭像 發(fā)表于 06-06 11:10 ?6888次閱讀
    博途使用<b class='flag-5'>STL</b><b class='flag-5'>中</b>的MOVE指令

    如何顯示STL程序的程序狀態(tài)

    在表循環(huán)更新并顯示程序的狀態(tài)。執(zhí)行 STL 程序后立即顯示這些表格。并讀取程序每一行的執(zhí)行狀態(tài)。顯示內(nèi)容取決于所用的 CPU(S7-300、S7-400 或 S7-1500)。
    的頭像 發(fā)表于 08-23 10:31 ?1091次閱讀
    如何顯示<b class='flag-5'>STL</b>程序的程序狀態(tài)<b class='flag-5'>呢</b>?

    如何在STL的EN/ENO機(jī)制仿真示例?

    STL 程序塊調(diào)用的程序塊不提供 EN 和 ENO 參數(shù)。無論創(chuàng)建程序塊時(shí)采用何種編程語言,都可通過狀態(tài)字的 BR 位將錯(cuò)誤語句傳送到 STL 程序塊。
    的頭像 發(fā)表于 09-01 09:45 ?1144次閱讀

    C++STL容器的常見容器及基本操作

    一、什么是容器? 所謂容器,就是可以承載,包含元素的一個(gè)器件,它是STL六大組件之一,是容器、算法、迭代器中最重要也是最核心的一部分。 二、STL各大容器的結(jié)構(gòu)與分類 2.1 順序性
    的頭像 發(fā)表于 11-10 11:23 ?521次閱讀
    C++<b class='flag-5'>中</b><b class='flag-5'>STL</b>容器<b class='flag-5'>中</b>的常見容器及基本操作

    STL內(nèi)容介紹

    Library),是ANSI/ISO C++標(biāo)準(zhǔn)中最新的也是極具革命性的一部分。庫包含了諸多在計(jì)算機(jī)科學(xué)領(lǐng)域里所常用的基本數(shù)據(jù)結(jié)構(gòu)和基本算法。為廣大C++程序員們提供了一個(gè)可擴(kuò)展的應(yīng)用框架,高度體現(xiàn)了
    的頭像 發(fā)表于 11-13 11:32 ?949次閱讀
    <b class='flag-5'>STL</b>內(nèi)容介紹