演算法設計與分析(fd)

2021-10-13 05:36:22 字數 3792 閱讀 5401

###演算法是一組有窮的規則,它規定了解決某一特定型別問題的一系列運算。

##演算法的五個重要特性:確定性、可行性(有效性)、輸入、輸出、有窮性

###五個方面:設計、表示、證明、分析、測試

###分析演算法的兩個階段:事前分析、事後測試

運算的執行次數是從演算法的控制流程得來的

一般用頻率計數函式表示式中的最高次項表示演算法複雜性分析的最終結果 —— 限界函式,且忽略掉其係數,記為: g(n)

ο(1) < ο(logn) < ο(n) < ο(nlogn) < ο(n2) < ο(n3)ο(2n) < ο(n!) < ο(nn)

o記號:對任意正常數c,存在常數n0>0,使對所有的n≥n0,有|f(n)| ≤ c|g(n)|,則記作:f(n) = o(g(n))。

ω記號:對任意正常數c,存在常數n0>0,使對所有的n≥n0,有c|g(n)|≤|f(n)| ,則記作:f(n) = ω(g(n))。

###證明的方法:數學歸納法、反證法、反例法

在以下三種情況下,常常要用到遞迴的方法

資料結構是遞迴的:例如單鏈表就是一種遞迴資料結構

求解方法是遞迴的:典型的有hanoi問題求解

遞迴設計-獲取遞迴模型例

氣泡排序

n皇后問題

例:二分檢索

重疊子問題

0-1揹包問題

剪繩子問題

for i in range(4,n+1):

maxs = 0

for j in range(1,i/2+1):

mult = h[j] * h[i-j]

if maxs < mult:

maxs = mult

h[i] = maxs # 每次j的迭代輪詢出該長度的最大值

print h

return h[n]

###貪心演算法總是作出在當前看來最好的選擇。也就是說貪心演算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的區域性最優選擇。

揹包問題(單位重量價值最高)

最優裝載

哈夫曼編碼:用最小堆實現優先佇列q

多機排程問題

最小生成樹問題。擬陣的角度分析最小生成樹問題。

對於無向圖 g= (v , e) 【注 : v 是點集,e 是邊集】

我們定義這樣乙個m=(s,l):

(1) s=e

(2) l=

這個 m 顯然滿足子集系統的前兩個條件。這裡證明其具有遺傳性與交換性:

遺傳性:對任意a∈l, b⊆a , 顯然b⊆e。假設 b 中有環,那麼 a 中也一定有環,與 a∈l 矛盾,故 b 中無環,因此b∈l , m具有遺傳性。

交換性:對任意a∈l,b∈l,設|a|<|b|,顯然 ga =(v,a) 中有|v|-|a| 個連通分量 , gb=(v,b) 中有|v|-|b|個連通分量。

由|a|<|b| 有 |v|-|a|>|v|-|b| , 可知此時 b 中一定存在一條邊 x 連線了 g_a 中的兩個不同的連通分量。顯然,g』=(v,a∪)中無環且a∪∈l ,因此m具有交換性。

綜上,m是乙個擬陣。

常用剪枝函式

n後問題

def queens(num, state=()):

for pos in range(num):

if not conflict(state, pos):

if len(state) == num - 1:

yield (pos,)

else:

for result in queens(num, state + (pos,)):

yield (pos,) + result

def prettyprint(solution):

def line(pos, length=len(solution)):

return 』 . 』 * (pos) + 』 x 』 + 』 . 』 * (length - pos - 1)

for pos in solution:

print(line(pos))

- ifname== 『main』:

solutions = queens(8)

for index, solution in enumerate(solutions):

print(「第%d種解決方案:」 % (index + 1), solution)

prettyprint(solution)

print(』*』 * 100)

圖的m著色問題

批處理作業排程

###分支限界法則以廣度優先或以最小耗費優先的方式搜尋解空間樹,將活結點存放在乙個特殊的表中。其策略是:在擴充套件結點處,先生成其所有的兒子結點,將那些導致不可行解或導致非最優解的兒子捨棄,其餘兒子加入活結點表中。此後,從活結點表中按照一定的規則取出乙個結點作為當前擴充套件結點。並重複上述結點擴充套件過程。

ifname== 『main』:

bag(10)

n = 4

x = [0, 1, 2, 3]

g = ,

『2』: ,

『3』: ,

『4』:

}graph = [

[0, 30, 6, 4],

[30, 0, 5, 10],

[6, 5, 0, 20],

[4, 10, 20, 0]

]- bestcost = math.inf # 好吧 乾脆就無窮好了

nowcost = 0 # 全域性變數,現在的花費

def tsp(graph, n, s):

global cc, bestc

if (s == n):

if (graph[x[n - 1]][x[0]] != 0 and (cc + graph[x[n - 1]][x[0]] < bestcost)):

print(『best way:』, x)

bestcost = cc + graph[x[n - 1]][x[0]]

print(『bestcost』, bestcost)

else:

for i in range(s, n):

# 如果下一節點不是自身 而且 求得的值小於目前的最佳值

if (graph[x[i - 1]][x[i]] != 0 and cc+ graph[x[i - 1]][x[i]] < bestcost):

x[i], x[s] = x[s], x[i] # 交換一下

cc += graph[x[s - 1]][x[s]] # 將花費加入

tsp(graph, n, s + 1)

cc -= graph[x[s - 1]][x[s]] # 回溯上去還需要減去

x[i], x[s] = x[s], x[i] # 別忘記交換回來

tsp(graph, n, 1)

拉斯維加斯(las vegas)演算法

舍伍德(sherwood)演算法

###基本特徵是對所求解問題的同一例項用同一概率演算法求解兩次可能得到完全不同的效果(所需時間或計算結果)

###隨機數在概率演算法設計中扮演著十分重要的角色:偽隨機數(線性同餘法)

###p類問題:多項式時間內可解的問題

###np類問題:多項式時間內可驗證問題(指驗證其解的正確性)

###歸約:乙個問題a可以約化為問題b的含義即是,可以用問題b的解法解決問題a

###在多項式時間複雜度內,求解到最優解一定距離的次優解。有確切最優解但是並不能保證得到最優解的演算法都可以稱之為近似演算法

旅行售貨員問題

xmind - trial version

演算法設計與分析

輸入輸出 確定性有窮性 np類問題是非確定性計算模型下的易驗證問題類。所有可以在多項式時間內求解的判定問題構成p類問題 1 二分搜尋技術 二分搜尋演算法的基本思路是對給定已排好序的n個元素a 0 n 1 在這n個元素中找出乙個特定元素x。運用分治的思想,將n個元素以n 2為中心對半分。if x a ...

演算法分析與設計

分析,此題可以用動態規劃來做。子問題為 max i max i 1 0 max i 1 nums i nums i max i 表示以nums i 結尾的子串的最大和,最後返回最大的那個即為所求,複雜度為o n class solution return max 另一種實現方法,更加簡潔,即從前往後...

演算法設計與分析

ylbtech miscellaneos 演算法設計與分析 a,返回頂部1,演算法設計與分析 是2009年國防工業出版社出版的圖書,作者是張德富。書主要取材於演算法設計與分析領域的經典內容,並介紹了演算法設計的發展趨勢。內容主要包括非常經典的演算法設計技術,例如遞迴與分治 動態規劃 貪心 回溯 分支...