1. 程式人生 > >heap(max-heap最大堆、min-heap最小堆)

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演算法

  1. 將N個元素按輸入順序存入,先滿足完全二叉樹的結構特性。
  2. 調整各節點位置,以滿足最大堆的堆序性。這樣建立最小堆時的時間代價為O(N)。在調整節點位置時,只需對從第N/2個節點到第一個節點依次應用“下溯”程式即可,其實也就是進行了N/2次的近似刪除操作。

相關推薦

heapmax-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通過greaterless指定排序方式,實現大堆功能

    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分享程式並且互跳程式回到APPAPP跳轉程式

一直以為APP不能分享小程式幾天親自試了一下,哎呀媽呀盡然可以~今天真的是學習了… 1、微信分享小程式(微信官網) WXMiniProgramObject miniProgramObj = new W

快速上手Vue適合懂基礎htmlcss和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   效果圖:

排序--【演算法導論】

堆排序的思想在堆排序(最大堆)已做說明,故不再贅述; 總之,思想就是首先進行建堆,由於這是最小堆,故而必須保證父節點都小於孩子節點,若不滿足條件,則進行調節; 最後進行堆排序,不斷將最小的提取出來,並對剩下的進行調節,使之滿足最小堆; 故而將最大堆中的判斷父節點與孩子大小部