文章目錄
#算法設計
數據結構
前邊的常規數據結構
鏈表、堆棧和隊列看了也記不住,知道意思用到了再看看。
樹
樹
- 一棵樹有一個根節點,根節點沒有父節點
- 其餘節點可以分成m個互不相交的集合,每個集合也是一棵樹,成爲根節點的子樹
- 沒有子節點的節點叫葉節點
- 節點的子樹個數叫做節點的度(degree)
二叉樹
二叉樹是指每個節點最多有兩個子節點的樹,其中第一和第二個子節點的分別叫做左子節點右子節點,對應的子樹分別叫做左子樹和右子樹。
堆
堆是一種特殊的完全二叉樹,它要求節點中的存儲的元素類型可比較,且任意一個節點中的元素都不大於其子節點的元素。
圖
圖是指由若干定點和連接其中某些頂點的邊所組成的圖形,一個圖經常可記錄爲,其中V表示頂點的集合,表示邊的集合。
- 從頂點到自身的邊成爲自環,連接相同頂點的兩條邊成爲平行邊,沒有自環和平行邊的圖稱爲簡單圖,除非特別聲明,一般所指的圖都是簡單圖。
- 如果,那麼互爲鄰接頂點,邊與頂點和互相關聯。頂點的度指與相關聯的邊的數量。
- 從某一個頂點出發,如果經過一系列的邊可以到達另一個頂點,則兩個頂點是連通的,經過的序列成爲路徑。
- 如果路徑不存在重複的頂點,那麼稱這樣的路徑爲簡單路徑。
- 如果圖中任意兩個頂點之間都有路徑,那麼稱圖爲連通圖。
- 如果圖中的每條邊都是無向的,那麼該圖叫做無向圖,如果每條邊都是有向的,那麼該圖叫做有向圖。
- 如果給圖中的每條邊賦予一個權值,那麼稱這樣的圖叫做加權圖。
蠻力法
什麼叫蠻力法
蠻力法(Brute Force)就是窮盡所有可能的情況來尋找問題的解。
冒泡排序
大元素不斷向數組尾部移動的過程類似於水中氣泡上升的過程,因此該算法叫冒泡排序算法。
遞歸與分治法
樹與圖中的一些遞歸問題
二叉樹的遍歷
二叉樹的遞歸算法:二叉樹的前序遍歷結果,其中每個節點應出現在其子節點之前,且左子節點出現在右子節點之前。
Algorithm RecPreOrder(root:BTreeNode<T>)
begin
if (root = null) then return 1;
return root.value @ RecPreOrder(root.left) @ RecPreOrder(root.right);
end
分治法的基本思想
- 將原問題分解成若干個規模較小的問題
- 對這些子問題分別進行合併
- 對各個子問題的解進行合併,從而得到原問題的解
動態規劃法
基本思想
先將問題分解,然後在對這些較小的子問題求解,將問題結果記錄,在以後的計算過程中遇到相同的子問題就直接讀取其結果。
貪心算法
基本思想
將眼前的利益最大化,找到每一步的最優解
可解決的問題
找零錢問題,最大數量裝載問題,最小生成樹、單源最短路徑、往返運輸問題、區間活動安排問題、哈夫曼樹。
回溯與分支限界
基本思想
狀態空間
在解決問題時,我們都需要先定義解的表示形式,一遍對問題的搜索空間(也叫狀態空間)進行刻畫,給定一個問題實例,其所有可能解構成了問題的完整狀態空間。
狀態空間樹
爲了改進蠻力法,一般應按照一定方式來對問題的狀態空間進行組織,一遍在搜索過程中應用一些策略來避免無效搜索,加速求解過程,最常見的就是狀態空間樹。
按照樹結構的形式對問題的狀態空間進行組織,這就是狀態空間樹。書中的每個節點對應問題求解過程中的一個狀態。
迭代改進算法
暫時用不到
計算複雜性與NP理論
暫時用不到
近似算法
暫時用不到
參數化算法
暫時用不到
隨機算法
隨機算法的含義
隨機算法的特點是允許算法在執行過程中隨機的選擇下一個計算步驟,隨機算法的特點是,對於同一種問題實例,多次運行同一種算法可能得到不同的結果。隨機算法的運行結果大致有以下兩種情況:
- 總能計算出寄一個解,但不一定保證解的正確性。
- 求解不一定成功;但只要成功,就能得到一個正確的。
對於前一種情況,人們主要關心解的正確概率是多少;對於後一種情況,人們主要關心求解成功的概率是多少,因此隨機算法又被叫做概率算法。
設計的一般步驟
隨機算法的一般步驟如下:
- 對給定問題設計的一個較爲合適的確定性算法A;
- 分析算法那A的各個步驟以及每一步驟的有關操作,選取其中一些特定步驟或操作進行隨機化,從而得到隨機算法;
計算機無法產生絕對的隨機數,計算機產生的隨機數只是一定程度上是隨機的,或稱爲僞隨機數。隨機數可以分成均勻隨機數、正太隨機數、Poisson隨機數、Gamma隨機數等,其中產生均勻隨機數中最常用的方法稱爲線性同餘法,生成一系列隨機數。 其中,d稱爲隨機序列的種子,m >0 稱爲模,a與c分別是乘數與增量,且滿足 。不同的取值影響到產生隨機序列的性能,一般來說應該讓儘可能的大,且讓和的最大公約數爲1,通常讓爲一個素數。
現代優化算法
禁忌搜索
禁忌搜索的含義
禁忌搜索(tabu search)算法是對鄰域搜索的改進,其主要思想是避免搜索過程中多次回到同一點上,以便提高算法跳出局部最優解的能力。算法實現時,可以用一個禁忌表T來記錄最近實施的搜索過程,並在接下來的若干搜索中禁止重複這些過程。
基本過程
- 找到問題的一個初始可行解,令當前解,禁忌表T爲空。
- 如果終止條件滿足,那麼返回當前已找到的最優解,算法結束。
- 否則,在的鄰域中選取一個未被禁忌且評價最好的解,將從到的搜索步更新到禁忌表T中,靈當前解並轉到第二步。
在禁忌搜索中常常需要增加一個“特赦“法則,如果發現某個鄰域解比較理想,那麼即使被禁忌表禁忌,仍可以選取它作爲新的當前解。
模擬退火算法
模擬退火算法的基本思想
模擬退火(simulating annealing)算法就是通過模擬物體的退火過程來進行尋優計算。它將問題的解模擬爲物體的狀態,解的目標函數值模擬爲物體在此狀態下的能量;在某一個溫度下,搜索從一個狀態隨機的變化到另一個狀態,到達每個狀態的次數服從統計力學中的概率分佈;當溫度很低時,搜索過程講義較大的概率停留在最優解。
基本過程
- 找出問題的一個初始解,令(初始最高溫度)
- 如果終止條件滿足,那麼返回當前已找到的最優解,算法結束。
- 從當前解的鄰域中隨機選取一個解,計算能量差 ,如果是負數或者一個很小的正數,則令。
- 如果當前溫度下的迭代次數超過上限,則轉到第五步,否則轉到第三步。
- 令,其中爲溫度變化函數,而後轉到第三步。
遺傳算法
基本思想
將問題的編解碼爲“染色體”,組成編碼的元素成爲“基因”,在泛迭代過程中,按照“適者生存”的規律,選取適應度高的染色體進行復制,並對他們進行雜交(crossover)和編譯(mutation)操作,產生新一代更適應環境的染色體羣。通過一代代不斷的進化,直至產生出最適合環境的個體,並將其作爲問題的最優解。
基本過程
- 生成問題的一組初始解,將其作爲初始羣體
- 如果終止條件滿足,那麼返回當前已找到的最優解,算法結束
- 計算羣體中每個個體的適應度,選取其中適應度較高的一些個體作爲種羣
- 在種羣個體之間進行雜交操作,得到新一代羣體
- 在新羣體中選取少量個體進行變異操作,而後轉第2步。
對個體適應度進行評價的函數通常可取問題的目標函數,有時也可去其他相關的評價函數。
從羣體中尋去種羣時,應當以適應度作爲標準,是的適應度越高的個體被選中的概率越大;但選取過程還應具有一定的隨機性,是的適應度相差不大的個體都有被選中的可能,一種常見的選擇方法叫做”輪盤賭“的方法。設羣體的規模爲N,其中每個個體的適應度爲,那麼個體的選擇概率如下:
蟻羣算法
基本思想
蟻羣算法是模擬自然界中蟻羣的覓食行爲的一種算法,在蟻羣中,每隻螞蟻都會在經過的路徑上分泌一定的信息素,經過的螞蟻數量越多,路徑上的信息素含量也就越高,而接下來的螞蟻選擇該路徑的概率也就越大,這種蟻羣搜索路徑的過程是一種正反饋的過程。
在早期的蟻羣算法中,信息素一旦分泌就不會減少,這不利於算法的收斂,在後續的改進中,原有的信息素會以一定的固定比例揮發。
粒子羣算法
基本思想
該算法模擬自然界中的飛鳥集羣活動的規律,在狀態空間中搜索計算問題的最優解。將例子看成狀態空間飛行的、吾提及無質量的個體。每個粒子都根據自我經驗以及想起他粒子的學習來調整飛行軌跡,從而改善搜索效率,促進整個羣體向最優解收斂。
在n維解空間中,每個粒子i具有一個位置向量和一個速度向量,算法在搜索過程中記錄下每個粒子i迄今爲止搜索到的最優位置,以及整個粒子羣起勁位置搜索到的最優位置,二者分別稱爲局部最優解和全局最優解,在算法的每次迭代中,每個粒子都按照下面的公式更新速度和位置
N表示粒子數量,w表示慣性權重,和表示學習因子,和表示0~1之間的隨機數。
基本過程
- 隨機生成問題的一組初始解,對粒子羣進行初始化
- 如果終止條件滿足,那麼返回當前已找到的最優解,算法結束
- 按照上面的公式計算每個粒子的速度和位置
- 更新每個粒子的局部最優解,並更新整個羣的全局最優解,轉到第3步。
在算法中,較高的值有利於粒子探索新的區域,而較低的有利於粒子趨向於彙集,那麼科室的該值隨着迭代次數的增加而現行下降。