第八章堆积 - Read.PPT

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章堆积 - Read

第八章 堆 積 堆積(heap)是樹結構的第三種型態。堆積是一棵二元樹,其左右子樹節點的值均較其父母節點的值小。堆積的根節點值保證是該樹最大值。這中堆績稱為最大堆績。堆積的子樹可擺在左邊當左子樹,也可擺在右邊當右子樹,因此左右子樹俱有相同的性質。 堆積還有一個有趣的特性,就是以陣列實作較以連結串列實作佳。當以陣列實作堆積時,已知父母節點的註標(subscript)就可算出其左右子樹節點的註標,反之亦然。 若父母節點的註標 i 從 0 開始計數時,則左子樹節點的註標為 2*i+1,右子樹節點的註標為 2*i+2。 若父母節點的註標 i 從 1 開始計數時,則左子樹節點的註標為 2*i,右子樹節點的註標為 2*i+1。 已知子女節點的註標也可算出其父母節點的註標,因此處理的效率相當高。 8.1 基本觀念 一棵堆積是一棵二元樹,俱備下列的特性: 1. 這棵樹是一棵完整或接近完整的二元樹。 2. 每一節點的鍵值大於或等於其子樹節點鍵值。 一棵完整的二元樹是每一層次(level)都佔滿,一棵接近完整的二元樹指其葉節點相差在一個層次以內。堆積如下圖所示。 三種堆積舉例 在上圖的兄弟節點裡,左節點有大於右節點者(139),左節點有小於右節點者(711,1924),這對於前面章節說明過的二元搜尋樹是不允許的。注意上圖(c)是一棵接近完整的二元樹,第二層次是從左而右填滿的,這也是堆積的要求。 堆積有兩個基本的操作 對於堆積有兩個基本的操作:插入一個節點以及移除一個節點。雖然堆積是一棵樹,但對它執行遍訪、搜尋、列印的操作並無意義。要實作堆積的插入及移除節點操作,我們需要兩個演算法,再堆上(reheap up)以及再堆下(reheap down)。 8.1.1 再堆上作業 假想我們有一個 N 個元素的接近完整二元樹,其前面的 N-1 個元素均已滿足堆積的要求,但最後一個元素 N 卻不滿足堆積,換句話說只要第 N 個元素滿足堆積的要求,整個結構就是一個堆積了。再堆上作業將第 N 個元素往上堆,定位於正確的位置,使整個結構成為一個堆積。 26往上移動 上圖新元素 26 插入原來已成堆積的樹。最後的元素規定要擺在最右邊的。26 比它的父母節點 13 還大,違反堆積的規定,必須互換,因此就往上移動,如下圖所示。 26再往上移動 26 比它的父母節點 43 還小,就不必再移動,已經定到正確的位置了。這種再堆上使成堆積的作業稱為再堆上操作。 8.1.2 再堆下作業 再堆下作業事實上是再堆上的相反操作。舉例如下圖。 8.2 堆積實作 雖然堆積可以透過動態樹結構建立起來,但最常見的還是以陣列實作為宜。一個節點與其子女節點的關係可以計算出來,如下所述: 1. 若節點註標為 i(從0算起),則其子女節點的註標計算 如下: a). 左子女節點註標為 2*i+1 b). 右子女節點註標為 2*i+2 2. 若節點註標為 i(從0算起),則其父母節點的註標計算 如下:取 (i-1)/2 之整數部份。 3. 左子女節點註標為 j,右子女節點註標為 j+1。 右子女節點註標為 k,左子女節點註標為 k-1。 4. 設完整堆積元素數為 n,第一個葉節點為 (n/2) 之整數部份。最後的枝節點註標為 (n/2)-1 之整數部份。 堆積以樹及陣列表示 1. 33 的註標為 2(從0算起),左子女節點 24 註標 為 2*2+1=5,右子女節點 20 註標為 2*2+2=6。 2.

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档