heap(max-heap最大堆、min-heap最小堆)
參考: 《STL原始碼剖析》
heap概述
heap並不歸屬於STL容器元件,它是個幕後英雄,扮演priority_queue的助手(底層實現)。所謂binary heap就是一種完全二叉樹,也就是說,整顆binary tree除了最底層的葉子節點之外,是填滿的,而最底層的葉節點由左至右又不得有空隙。
完全二叉樹整棵樹內沒有任何節點漏洞,這帶來一個好處:我們可以利用array來儲存所有節點。假設我們動用一個小技巧,將array的#0元素保留(或設為無限大值或無限小值),那麼完全二叉樹中的某個節點位於array的i處時,其左子節點位於array的2i處,其右子節點位於array的2i+1處,其父節點位於“i/2".
最大堆max-heap:每個節點的鍵值(key)都大於或等於其子節點鍵值
最小堆min-heap:每個節點的鍵值(key)都小於或等於其子節點鍵值
heap演算法
1)push_heap演算法
新元素插入到底層vector的end()處,然後對最底端元素執行“上溯程式”。時間複雜度O(logN)。
演算法思路:新元素是否適合於現有位置?為滿足max-heap的條件(每個節點的鍵值都大於或等於其子節點鍵值),我們執行一個所謂的上溯程式:將新節點拿來與其父節點比較,如果其鍵值比父節點大,就父子對換位置。如此一直上溯,直到不需要對換或直到根節點為止。
SGI STL:
incline void push_heap(RandomAccessIterator first, RandomAccessIterator last);
注意,此函式被呼叫時,新元素應已置於底層容器的最底端
2)pop_heap演算法
堆頂元素和最底端元素交換,縮小堆長,對堆頂執行“下溯程式”。時間複雜度為O(logN)。
inline void pop_heap(RandomAccessIterator first,
RandomAccessIterator last);
注意:該函式接受兩個迭代器,用來表現一個heap底層容器vector的頭尾。
3)sort_heap演算法
既然每次pop_heap都獲得heap中鍵值最大的元素,如果持續對整個heap做pop_heap操作,每次將操作範圍從後向前縮減一個元素(因為pop_heap會把鍵值最大的元素放在底層容器的最底端),當整個程式執行完畢時,我們便有了一個遞增序列。時間複雜度O(NlogN)。
4)make_heap演算法
- 將N個元素按輸入順序存入,先滿足完全二叉樹的結構特性。
- 調整各節點位置,以滿足最大堆的堆序性。這樣建立最小堆時的時間代價為O(N)。在調整節點位置時,只需對從第N/2個節點到第一個節點依次應用“下溯”程式即可,其實也就是進行了N/2次的近似刪除操作。
相關推薦
heap(max-heap最大堆、min-heap最小堆)
參考: 《STL原始碼剖析》 heap概述 heap並不歸屬於STL容器元件,它是個幕後英雄,扮演priority_queue的助手(底層實現)。所謂binary heap就是一種完全二叉樹,也就是說,整顆binary tree除了最底層的葉子節點之外,是填滿的,而最
堆樹(最大堆、最小堆)詳解
一、堆樹的定義 堆樹的定義如下: (1)堆樹是一顆完全二叉樹; (2)堆樹中某個節點的值總是不大於或不小於其孩子節點的值; (3)堆樹中每個節點的子樹都是堆樹。 當父節點的鍵值總是大於或等於任何一個
堆樹(最大堆 最小堆)詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
最大堆、最小堆定義及其C++程式碼實現
資料:https://blog.csdn.net/guoweimelon/article/details/50904346 但是它的最大堆刪除部分的程式碼有問題,詳見連結裡的評論區 定義 堆首先必須是一棵完全二叉樹 最大堆:完全二叉樹,父節點的值不小於子節點的值 最小堆:完全二叉樹,父節
C++ multiset通過greater、less指定排序方式,實現最大堆、最小堆功能
STL中的set和multiset基於紅黑樹實現,預設排序為從小到大。 定義三個multiset例項,進行測試: multiset<int, greater<int>> greadterSet;
最大堆(最小堆)C++實現原始碼
寫在前面 最近漸漸愛上寫部落格,覺得每天學到的知識需要保鮮,寫的原始碼也能及時與大家分享,接下來進入正題。 最大堆(最小堆) 最大堆(最小堆)是非常重要的資料結構,公司面試時經常會被問到,在這裡,我不會詳細介紹它的原理,而是介紹它的適用場景以及兩種寫法
堆樹(最大堆和最小堆)
一、堆樹的定義堆樹的定義如下:(1)堆樹是一顆完全二叉樹;(2)堆樹中某個節點的值總是不大於或不小於其孩子節點的值;(3)堆樹中每個節點的子樹都是堆樹。當父節點的鍵值總是大於或等於任何一個子節點的鍵值時為最大堆。 當父節點的鍵值總是小於或等於任何一個子節點的鍵值時為最小堆。如
求陣列中最小的k個數以及海量資料最大堆、multiset解決方案
【題目】 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 【方案一】 主要有兩種方案。第一是利用我們熟知的 partition 演算法,它是快速排序的核心,相信每個人都會。它可以用來求取陣列的任
在內容頁中調用母版頁控件、響應控件消息(用戶控件、服務器控件有所不同)
color pos new handle ascx clientid sender name ast 原文發布時間為:2009-11-13 —— 來源於本人的百度文章 [由搬家工具導入]总结来源百
realloc 使用詳解(分析realloc invalid pointer、指針無效等錯誤)【轉】
strong 開源 堆區 找到 失敗 temp idt googl 發生 來源:http://www.cnblogs.com/ladd/archive/2012/06/30/2571420.htmlrealloc函數用來為ptr重新分配大小為size的一塊內存,看似很簡單,
Python Day 15 (遞歸函數、二分查找算法)
AS 開頭 nbsp start val set 想象 來看 details Python Day 15 (遞歸函數、二分查找算法) 遞歸函數 在一個函數裏在調用這個函數本身。 遞歸的默認最大深度:998 修改默認最大深度 import sys print(s
C++設計模式-繼承與多型影響耦合性(最基礎的簡單工廠模式小例項)
繼承與多型影響耦合性(最基礎的簡單工廠模式小例項) 原理: 通過繼承和虛擬函式的方式修改某個子類對應函式的功能; 通過簡單工廠模式到底例項化誰; 如果要增加複雜的運算只有增加響應的子類,以及工廠的分支即可; 程式執行截圖如下: 目錄結構如
c# 數字轉成千分位字串 C# 數字帶逗號(千分位符、金錢千分位字元)
C# 數字帶逗號(千分位符、金錢千分位字元) 首先要明確帶了逗號之後 數字就變成字串了 ,不再是數字了。 昨天做專案的時候需要格式化數字變成帶逗號的,本來打算自己寫個方法的,後來時間太緊了,就打算從網上查個,查來查去都是要對字串的位進行操作,選
Python開源Devops定時任務管理系統(含定時呼叫介面、定時ssh遠端執行命令)
OpenMangosteen Devops定時呼叫http介面,定時執行SSH命令的WEB定時任務工具。本系統強依賴Flask-APScheduler的功能,只是拓展了web頁面部分。使用Pytho
堆排序(最小堆)C++
堆分為大根堆(最大堆)和小根堆(最小堆),堆排序就是二叉堆的升級版,實際上是一棵完全二叉樹 不同的是這棵二叉樹裡每個節點保證父節點都小於孩子節點 最後進行堆排序,將堆頂最小的節點(第一個)與最後一個節點(最大的節點)進行交換,對剩下的進行調節,令其滿足最小堆 #incl
Android分享小程式並且互跳(小程式回到APP、APP跳轉小程式)
一直以為APP不能分享小程式幾天親自試了一下,哎呀媽呀盡然可以~今天真的是學習了… 1、微信分享小程式(微信官網) WXMiniProgramObject miniProgramObj = new W
快速上手Vue(適合懂基礎html、css和js的人)
快速上手Vue 前述 1. 目標是通過本文,快速瞭解Vue的基本原理和使用它進行簡單的開發 2. 只需要html、css、js基礎即可(原理涉及ES5,ES6,但對開發者來說不是必須要學的) 3. 這是根據我內部分享的PPT改寫的 目錄 1. 概述 2
二叉樹遍歷(已知先序、中序求後序)
【例3-4】求後序遍歷 時間限制: 1000 ms 記憶體限制: 65536 KB 提交數: 11 通過數: 9 【題目描述】 輸入一棵二叉樹的先序和中序遍歷序列,輸出其後序遍歷序列。 【輸入】 共兩行,第一行一個字串,表示樹的先序遍歷,第二行
縮圖(縮略成圓形、按一定比例縮放)
一、縮略成正方形 加上樣式border-radius: 50%; 可變為圓形 效果圖: 二、縮略成指定大小的圖片 圖片本來大小300*150,現縮略成120*80 效果圖:
堆排序(最小堆)--【演算法導論】
堆排序的思想在堆排序(最大堆)已做說明,故不再贅述; 總之,思想就是首先進行建堆,由於這是最小堆,故而必須保證父節點都小於孩子節點,若不滿足條件,則進行調節; 最後進行堆排序,不斷將最小的提取出來,並對剩下的進行調節,使之滿足最小堆; 故而將最大堆中的判斷父節點與孩子大小部