當堆遇到STL 代碼煥發光芒

來自度孃的釋義,堆的含義大概是這樣的:c++

感性理解:算法

堆(英語:heap)是計算機科學中一類特殊的數據結構的統稱。堆一般是一個能夠被看作一棵樹的數組對象。堆老是知足下列性質:
  • 堆中某個節點的值老是不大於或不小於其父節點的值;
  • 堆老是一棵徹底二叉樹。
將根節點最大的堆叫作最大堆或大根堆,根節點最小的堆叫作最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。

理性理解:數組

堆的定義以下:
  n個元素的序列{k1,k2,ki,…,kn}當且僅當知足下關係時,稱之爲堆。
  (k i <= k 2i,k i <= k 2i+1)或者(k i >= k 2i,k i >= k 2i+1), (i = 1,2,3,4...n/2)

然而手寫堆實在太困難有點長了,在NOIp&&NOI賽場上時間有限,因此一個模板的重要性不言而喻;(好比我排序向來都是sort數據結構

 

會手寫堆的都是神犇!less

 

真的!函數

 

反正我寫不了2333oop

 

因此上帝爲可愛的c++黨準備了貼身的STL模板-->heap;spa

 

1.make_heap 構建堆

  默認用法 (但這樣生成的是大根堆;若是須要構建小根堆,須要進行修改。.net

 

    Eg:c++11

1 vector<int> v{6, 1, 2, 5, 3, 4};
2 make_heap(v.begin(), v.end());

  

  自建小根堆  

    Eg:自定義比較函數:(彷佛是這樣我並不太懂

1 vector<int> v{6, 1, 2, 5, 3, 4};
2 make_heap(v.begin(), v.end(), greater<int>());

    這裏使用了greater<int>()來代替默認的less<int>()來建立int類型的heap。

 

    能夠按層次遍歷的順序把這個heap畫出來,能夠看到它跟默認狀況恰好相反,會是一個小頂堆。

2. push_heap 把指定區間的最後一個元素插入到堆中

 1 v.push_back(200);

2 push_heap(v.begin(), v.end());  

 注意:須要知足的是此時的v必須知足是一個在區間(v.begin(), v.end())內知足堆的性質;不能直接比較23333

 

因此我一直以爲即便手寫堆也可使用模板

 

畢竟我不會寫

 

這樣就比較簡單。

3. pop_heap 把指定區間的最後一個元素插入到堆中

好比這樣:

1 pop_heap(v.begin(), v.end());

2 auto largest = v.back();

3 psln(largest);

4 v.pop_back();  

依舊須要知足v是一個堆;

 

並且他會將除最大值之外的節點重排;而v.back( )便將其找到了;

 

因此刪除它只須要令v.back()=0就好了。

 

海星

3. pop_heap 把指定區間的最後一個元素插入到堆中

sort_heap(v.begin(), v.end());
printContainer(v, "after sort_heap: ");

 堆排序;

沒了

c++11裏面的玄學東西高考完再說

如今不敢用

畢竟我是一個聯賽選手

 

 

 

引用資料:

  • 【C++ STL應用與實現】72: 標準庫裏的堆--如何使用標準庫的heap算法 https://blog.csdn.net/elloop/article/details/53402209

  • 百度百科 堆  https://baike.baidu.com/item/%E5%A0%86/20606834?fr=aladdin
相關文章
相關標籤/搜索