原创 算法導論 第七章:快速排序(Quicksort)

        前面我們談論到的歸併排序、堆排序的時間複雜度都是O(nlgn),快速排序的時間複雜度也爲Θ(nlgn)。但在實際中,快排序往往要優於前兩種,因爲隱藏在Θ(nlgn)中的常數因子非常小。此外,快速排序是一種就地(in pla

原创 算法導論 第四章:分治法(一)

無論是在生活中還是在計算機科學中,“分而治之”的思想佔據着舉足輕重的地位,其原理如下:     1)將一個複雜的問題分成若干個相同或相似的子問題     2)遞歸求解子問題,當子問題規模很小時,可直接求解     3)將所有子問題的解合併

原创 算法導論 第六章:堆排序

(二叉)堆數據結構是一種數組對象,如下圖所知,他可以被視爲一顆完全二叉樹。 其有如下性質: 1)對於i節點(i表示下標),其父節點爲Li/2」,左孩子節點爲2i,右孩子節點爲2i+1 2)最大堆滿足:A[PARENT(i)] ≥ A[

原创 算法導論 第四章:分治法(二)

矩陣乘法問題     設矩陣A,B是nxn的方陣,我們將用分治法求解 C=A*B 。      我們用蠻力方法求解的運行時間複雜度爲:。利用分治法,將A,B,C劃分成4個n/2 x n/2 的矩陣,如下:                

原创 算法導論 第十章:基本數據結構

1.棧 基本操作: 所有操作的運行時間均爲:O(1) 2.隊列 基本操作: 所有操作的運行時間均爲:O(1) 3.鏈表 基本操作: SEARCH和DELETE操作的時間爲:Θ(n),INSERT操作的時間爲:O(1) 4.指針與

原创 算法導論 第十一章:哈希表

           當將一個域U中的元素映射到一個哈希表T中時,我們如何映射?若映射到同一位置怎麼辦?前一個問題我們通過hash函數來解決,後一個問題我們通過“衝突處理”解決。 1.Hash 函數 (1)除法      h(k) = k

原创 算法導論 第八章:線性時間排序

1.計數排序(Counting sort)    其基本思想是:對於每一個元素x,確定小於x的元素的個數,然後直接將x放在輸出數組的合適位置中。 其僞代碼如下: EG: 每個輸入的元素的範圍是0~k,k 不能太大,如果太大,分配給C的

原创 算法導論 第十六章:貪心算法之單任務調度問題

  貪心算法是使所做的選擇看起來都是當前最優的,通過所做的局部最優選擇來產生一個全局最優解。 其具有的性質如下: 1)貪心選擇性質:一個全局最優解可以通過局部最優(貪心)選擇來達到。即,在考慮如何做選擇時,我們只考慮對當前問題最佳的選擇而

原创 算法導論 第十五章:動態規劃之棒的切割(Rod Cutting)

    和分治法一樣,動態規劃(Dynamic programming)是通過組合子問題的解而解決整個問題的。 其不同點在於: 1)分治法是將問題劃分成一些獨立的子問題,遞歸求解各個子問題,然後合併子問題的解而得到原問題的解 2)動態規劃

原创 算法導論 第十八章;B 樹

       B樹是爲磁盤或其他直接存取輔助存儲設備而設計的一種平衡查找樹。B樹的”分支因子“可能很大,即每個節點可以有很多子女。這一因子由所用磁盤特性所決定,並且可以降低磁盤I/O操作次數。許多數據庫系統都使用B樹或B樹的變形來存儲信息

原创 算法導論 第二十一章:不相交集合的數據結構

       不相交集合(Disjoint-set )數據結構保持一組不相交的動態集合S={S(1),S(2),...,S(k)}.每個集合通過一個代表(representative)來識別,即集合中的某個成員。設x表示一個對象,不相交集

原创 算法導論 第十九章:斐波拉契堆

   斐波拉契堆是由一組最小堆有序樹組成,每棵樹遵循最小堆性質,並且每棵樹都是有根而無序的。所有樹的根通過left和right指針來形成一個環形的雙鏈表,稱爲該堆的根表。    對於一個給定的斐波拉契堆H ,可以通過指向包含最小關鍵字的樹

原创 算法導論 第五章:隨機算法

        許多隨機算法通過排列給定輸入數組來是輸入隨機化。在這裏我們將討論兩種隨機化方法。假設給定一個數組A,他包含元素1到n,我們的目標就是構造這個數組的一個隨機排列。    方法一:            爲數組中個每一個元素A

原创 算法導論 第十二章:二叉查找樹(Binary Search Trees)

      二叉查找樹具有如下性質:        x是二叉查找樹中的一個節點,如果y是x左子樹中的一個節點,則y.key ≤ x.key ; 如果 y 是 x 右子樹中的一個節點,則 x.key ≥ y.key.         在二叉

原创 算法導論 第六章:優先級隊列

        雖然堆排序的時間複雜度爲O(nlgn),但在實際中,快速排序(下一章將介紹)往往要優於堆排序。儘管如此,堆數據結構在其他方面有着很大的用處,如用於優先級隊列的實現。因爲堆可讓優先級隊列的所有操作的時間複雜度爲O(lgn)。