一,堆
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 ...