第一種:ordinary heap
我們最常用的二叉樹結構的堆,操作的時間複雜度為
make-heap - o(1)
insert - o(lg n)
minimum - o(1)
extract-min - o(lg n)
union - o(n)
decrease-key - o(lg n)
delete - o(lg n)
可以看出,除了union需要o(n)外,其它操作的時間複雜度都是可以接受的,而且由於實現非常簡單,在union操作很少的情況下,可以考慮使用這種結構的堆。
第二種:fibonacci heap
具體的結構和操作較為複雜,詳細參見《演算法導論》,它的操作時間複雜度為
make-heap - o(1)
insert - o(1)
minimum - o(1)
extract-min - o(lg n)
union - o(1)
decrease-key - o(1)
delete - o(lg n)
可以看出,所有的操作均要比第一種的堆快(但要注意第二種中的複雜度是amortized,而第一種中的複雜度是worst-case),但由於實現和操作比較複雜,因此,只有在特別要求效率的情況下,才會使用。
第三種:binomial heap
這是mergable heap中很重要的一種,結構和操作的複雜程度介於ordinary heap和fibonacci heap之間,詳細參見操作的時間複雜度為
make-heap - o(1)
insert - o(lg n)
minimum - o(lg n)
extract-min - o(lg n)
union - o(lg n)
decrease-key - o(lg n)
delete - o(lg n)
可以看出,union操作較ordinary heap有了提公升,因此,如果在應用中有很多union操作,而你又不想採用太複雜的結構,可以使用這種heap。
第四種:van emde boas trees
這種形式的結構和操作極其複雜,應用範圍較為侷限,它的資料要求是0~u的範圍內無重複的數字(當然你可以對此進行改進,使其支援重複數字),而且u需要是2的n次冪。但它的效能超過了lg n這個基於比較的堆的複雜度下限,所有操作的時間複雜度達到了o(lg lg n),詳細參見《演算法導論》。
不同型別語言
編譯型和解釋型的區別 先來看看編譯型語言定義 編譯型語言首先是將源 編譯生成機器指令,再由機器執行機器碼 二進位制 再來看看解釋型語言的定義 解釋型語言的源 不是直接翻譯成機器指令,而是先翻譯成中間 再由直譯器對中間 進行解釋執行。咋看一眼,還是一臉懵逼。下面打個比方 動態語言和靜態語言 我們常說的...
不同型別的檔案
cpp檔案 cpp是用c 語言編寫的源 檔案的字尾 具體實現 h檔案 h是c語言和c 語言的標頭檔案 函式宣告,巨集定義,函式原型 pde檔案 一共有4種可能,分別為 1 powerdesk encrypted file 2 pathology data exchange file 3 afp pa...
C 測試對比不同型別的方法呼叫的效能
1.例項方法呼叫 2.靜態方法呼叫 3.例項方法反射呼叫 4.委託方法的invoke呼叫 5.委託方法的dynamicinvoke呼叫 6.委託方法的begininvoke呼叫 1.首先要先對測試 和測試工具的方法進行預熱處理,即先呼叫一次然方法通過jit編譯成本機的 防止其對時間的損耗 雖然只有一...