演算法課程期末複習總結

2021-10-23 13:39:40 字數 3948 閱讀 3415

八大排序演算法複雜度比較

求解遞迴式的複雜度

max sum(最大子段和)

int len = arr.length;

int[

] dp =

newint

[len +1]

;dp[0]

=0;for

(int i =

1; i <= len; i ++

)int res = integer.min_value;

for(

int i =

1; i < dp.length; i ++

)return res;

dp[i] = max(dp[i-1] + nums[i], nums[i]) (1<=j<=n)dp[i]表示nums陣列從第1個到第i個數區間內的最大子段和

base case:dp[0] = 0

結果: 遍歷dp陣列,找出最大值,即為最大子段和

lcs(最長公共子串行)

int rows = str1.

length()

;int cols = str2.

length()

;int

dp =

newint

[rows+1]

[cols+1]

;for

(int i =

1; i <= rows; i ++

)else}}

return dp[rows]

[cols]

;

dp[i]

[j]表示str1[

1..i],str2[

1..j]的兩段字串的最長公共子串行

if str1[i]

== str2[j]

dp[i]

[j]= dp[i-1]

[j-1]+

1;else

dp[i]

[j]=

max(dp[i-1]

[j], dp[i]

[j-1])

;

base case:dp[..][0] = 0, dp[0][..] = 0;結果:dp[str1.len][str2.len]lps(最長回文子串行)

我們說這個問題對 dp 陣列的定義是:在⼦串 s[i…j] 中,最⻓回⽂⼦序列的⻓度為 dp[i][j] 。

具體來說,如果我們想求 dp[i][j] ,假設你知道了⼦問題 dp[i+1][j-1]的結果( s[i+1…j-1] 中最⻓回⽂⼦序列的⻓度),你是否能想辦法算出dp[i][j] 的值( s[i…j] 中,最⻓回⽂⼦序列的⻓度)呢?

可以!這取決於 s[i] 和 s[j] 的字元:如果它倆相等,那麼它倆加上 s[i+1…j-1] 中的最⻓回⽂⼦序列就是s[i…j] 的最⻓回⽂⼦序列:如果它倆不相等,說明它倆不可能同時出現在 s[i…j] 的最⻓回⽂⼦序列中,那麼把它倆分別加⼊ s[i+1…j-1] 中,看看哪個⼦串產⽣的回⽂⼦序列更⻓即可:

int rows = s.

length()

;int cols = s.

length()

;int

dp =

newint

[rows]

[cols]

;for

(int i =

0; i < rows; i++)}

}for

(int i = rows-

1; i >=

0; i --

)else}}

return dp[0]

[cols-1]

;

0-1 knapsack problem(0-1揹包問題)
dp[i][w] = max(dp[i-1][w] + (dp[i-1][w-w[i]] + val[i]) )

dp[i][w] 的定義如下:對於前 i 個物品,當前揹包的容量為 w ,這種情況下可以裝的最⼤價值是 dp[i][w]

base case:dp[0][..] = dp[..][0] = 0結果 :dp[n][w]

public

static

intmaxvalue

(int

v,int[

] w,

int weight)

else}}

return dp[rows]

[cols]

;}

區間排程問題
你今天有好⼏個活動,每個活動都可以⽤區間 [start, end] 表⽰開始和結束的時間,請問你今天最多能參加⼏個活動呢?顯然你⼀個⼈不能同時參加兩個活動,所以說這個問題就是求這些時間區間的最⼤不相交⼦集。

按完成時間從早到晚將活動排序

選取排序後的第乙個活動a1(即最早結束的活動)

在a1結束時間之前,刪除所有已經始時間的活動(即和a1有重疊)

遞迴地解決剩餘活動的問題

public

intintervalschedule

(int

intvs)})

;// ⾄少有⼀個區間不相交

int count =1;

// 排序後,第⼀個區間就是 x

int x_end = intvs[0]

[1];

for(

int[

] interval : intvs)

}return count;

}

部分揹包問題

總是優先選擇單位重量下價值最大的物品

將每個揹包按單位重量的價值從大到小排序

每次剩餘的價效比最大的加入到揹包中

或者剩餘容量不夠將整個揹包加入的話,則用當前揹包的部分去填滿剩餘空間

arrays.

sort

(packages,

newcomparator

()})

;for

(int i =

0; i < len; i ++

)else

}return res;

期末總結

小題考察了漸進上界、漸進下界、緊緻界的求解。還考察了幾種常用演算法的複雜度以及幾種演算法的概念典型應用場景。

大題分為兩部分,第一部分是用master方法求解三個遞迴式的複雜度(公式記錯了,尷尬)

第二部分是演算法分析與設計題,題目都是比較典型的題目。

分治:快排的過程

動規:最大子段和 最長回文子串行 0-1揹包問題

貪心:部分揹包 迪傑斯特拉

考完分享複習筆記,過過過!

演算法期末複習(二)

回溯法是一種試探的方法,從一條路走,能進則進,不能則退。例如 在數字1 2 3 9 順序不變 之間插入 或什麼都不插入,使得結果為100。include using namespace std define n 8 8個符號 int a int num 0 計算滿足條件的式子的個數 char op ...

演算法分析(期末複習版)

如果存在兩個正常數c和n0,對於所有的n n0,有 f n c g n 則記作 f n o g n o f n o g n o max f n g n o f n o g n o f n g n o f n o g n o f n g n 如果g n o f n 則o f n o g n o f n...

演算法期末總結

1.首先得構造解空間樹 子集樹和排列樹 2.以深度優先的方式搜尋解空間 遞迴或迭代 3.設計剪枝函式避免無效搜尋 使用約束函式,剪去不滿足約束條件的路徑或使用限界函式,剪去不能得到最優解的路徑。回溯法解問題的乙個顯著特徵是,解空間樹是虛擬的,在任何時候,只需儲存從根節點到當前擴充套件結點的路徑。在回...