程式設計珠璣 第十四章 堆(排序,優先順序佇列)

2021-08-26 22:06:07 字數 1984 閱讀 4329

一,堆

1)堆:任何結點的值都小於或等於其孩子的值的完全二叉樹為小根堆

任何結點的值都大於或等於其孩子的值的完全二叉樹為大根堆

為了方便使用完全二叉樹的性質,陣列從下標1開始。

這樣:leftchild = 2*i ;

rightchild = 2*i + 1 ;

parent = i/2 ;

null i < 1 or i > n

2)堆演算法分析

堆排序的最壞時間複雜度為o(nlogn)。堆序的平均效能較接近於最壞效能。

由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。

堆排序是就地排序,輔助空間為o(1)

堆排序是不穩定的

3)堆實現

【特別注意】

堆不一定是完全二叉樹但是一般採用完全二叉樹,主要是利於儲存和運算。堆排序作用在陣列上

初始建立堆:

給乙個陣列,將陣列看做完全二叉樹。

從最後乙個非葉結點(length/2,下標從1開始),直到第乙個結點a[1],向上調整建立堆。

排序和堆調整

將第乙個值a[1] 跟最後乙個值交換,然後對 a[1] 調整堆(此時陣列長度調整為length-1)

【注意】這裡初始建堆,只考慮已經有n個元素,向下調整建堆就可以搞定。

但是對於insert(t)怎麼辦? 採用向上調整堆的策略。詳細見下文優先佇列。

4)原始碼

#include"stdio.h"

inline void swap(int &a,int &b)

void heapadjust(int array,int i,int nlength)//自頂向下調整堆 }

int main()

; heapsort(a,8);

for(int i=1;i<9;i++)

printf("%d\n",a[i]);

return 0;

}

二,優先佇列 1)

優先佇列是0個或多個元素的集合,每個元素都有乙個優先權或值,對優先佇列執行的操作有1) 查詢; 2) 插入乙個新元素; 3) 刪除.

在最小優先佇列(min priorityq u e u e)中,查詢操作用來搜尋優先權最小的元素,刪除操作用來刪除該元素;

對於最大優先佇列(max priority queue),查詢操作用來搜尋優先權最大的元素,刪除操作用來刪除該元素.

優先權佇列中的元素可以有相同的優先權,查詢與刪除操作可根據任意優先權進行.

2)優先佇列實現

初始化乙個陣列,向空陣列依次插入元素,每插入乙個元素向上調整一次堆。

刪除元素,將第乙個元素跟最後乙個元素交換,並向下調整堆

3)**實現

#include using namespace std;

templateclass priqueue

public:

priqueue(int m)//初始化陣列

void insert(t t)

t extractmin()//向下調整堆

int main()

4)a.構造哈夫曼樹時候,需要選取當前陣列的兩個最小值,刪除兩個最小值,並將計算之和插入原來陣列。

採用堆,初建堆,兩次呼叫選取最小值的函式。計算之和之後,呼叫插入堆並調整堆

b.如果將較小浮點數和較大浮點數相加可能造成丟失精度。所以每次取最小的兩個相加。然後將和插入陣列集合。最後剩下乙個就是所有浮點數的和

c.典型的topk

d.將所有小檔案 要插入的當前值組成乙個堆。

取堆最小值,插入排序陣列。調整堆。然後插入該小檔案下乙個元素(無後繼則不操作)

5)剩餘容量組成堆,權值公升序插入堆

6)求指教(沒看懂)

7)求指教(沒看懂)

程式設計珠璣(2)第十四章學習筆記之「堆」

本章主要介紹 堆 和 優先佇列 資料結構的使用。堆可分為大根堆和小根堆。堆是某個節點的值總是不大於 大根堆 或不小於 小根堆 其父節點的完全樹。常見的堆有二叉堆和斐波那契堆,本章講的是二叉堆。由於二叉堆是完全二叉樹,所以我們在建堆的時候可以考慮用c 中的vector來作為儲存結構。堆有兩個比較重要的...

第十四章約束

約束 constraint 是一種保證資料完整性的規則。約束設定在單個字段或者多個字段組合上,寫入這些欄位的行資料必須要符合約束的規則 約束的五種型別 not null 非空約束,指定某列的所有行資料不能包含空值 unique 唯一性約束,指定列或者列的組合的所有行資料必須唯一 primary ke...

第十四章 約束

第十四章 約束 練習1 1.學校有乙個選課系統,其中包括如下關係模式 系 系編號 主鍵,系名稱 唯一鍵,系主任 非空約束,系所在校去 取值範圍只能在南湖校區和渾南校區 create table xi xi no varchar2 10 primary key,xi name varchar2 10 ...