title | tags |
---|---|
資料結構與演算法2筆記 |
筆記 |
這學期用js寫!
- 這學期會從 dynamic programming 開始,有四個方向。
- 今天點名有點到。
Divid and Conger 是一種解決「可以拆解」的問題的策略,D.P.是他其中一種應用。
D.P.=>
- 將問題拆解到最小的程度,然後求解並將該解保留下來。
- 接下來對上一層的問題求所有可能的拆解方式,用拆出的子問題的答案組合、比較已找出最佳解並記錄。
- 不斷重複,直到找出母問題的最佳解。
如何在下述 Knapsack 放進總價值最高的items: a knapsack with M capacity, N items with different size, value a[M] => size[N] value[N]
item | A | B | D | C | E |
---|---|---|---|---|---|
size | 3 | 4 | 8 | 7 | 9 |
for (int j = 1 ; j<=N ; j++){ // j是第幾個物件
for (int i = 1; i<=M ; i++){ // i是第幾格背包
if ((i-size[j])>=0){ //背包放得進去嗎?這個到後面都一定是true
if (cost[i] < (cost[i-size[j]]+ value[j])){
cost[i] = cost[i-size[j]]+value[j];
best[i] = j;
}
}
}
}
說明: cost[i] 是原來的最佳解;cost[ i-size[ j ] ]是扣掉一個j的容量剩下的總量(目前最佳解);第二個 if 是 triple operation。
- 當碰到一樣會留下舊的(在這邊的程式碼)
- 背包可沒有第零格阿
矩陣:
- 有結合率( A * B * C == (A*B)*C)
- 沒有交換率(|A| * |B| != |B| * |A|)
var i,j,k;
// var cost[N][N];
for ( i = 1; i<=N ; i++) {
for ( j = i+1; j<=N ; j++) {
cost[i][j] = Max;
}
}
for ( i=1 ; i<=N ; i++) {
cost[i][i] = 0;
}
// above is initialization
for ( j=1; j<=N-1 ; j++) {
for ( i=1 ; i<=N-j ; i++){
for ( k=i+1 ; k<=i+j ; k++ ){
t = cost[i][k-1] + cost[k][i+j]+r[i]*r[k]*r[i+j+1];
// r是row
if ( t < cost[i][i+j]){
cost[i][i+j] = t;
best[i][i+j] = k;
}
}
}
}
-
前提
-
看A-C
-
看 A-F
-
結論
繼續說這個
要怎麼應用呢?
- 一株二元樹
- 對每個節點(i)來說:
- 左子樹的key值 <= i的key值
- 右子樹的key值 > i的key值
- 就是只能放一邊,這樣樹比較漂亮,這堂課上講,左邊放小的
- 情景: 如果每個節點的出現頻度都知道......
- 想要求: 如何配置二元搜尋樹各節點的位置,使得內部路徑長最小?
- 應用?
- 一開始
- 想要得到最小勢必跟排的方法有關:
- 三個節點有五個排法
- code
for(i=1;i<=N;i++){
for(j=i+1;k<=N+1;j++){
cost[i][j]=Max;
}
} //初始化
for(var i=1;i<=N;i++){
cost[i][j]=freq[i];
}//把freq填進去
for(var i=1; i<=N; i++){
cost[i][i-1] = 0;
}//全部矩陣都填上0 把對角線左邊的藍色填進去???
for( var j=1 ;j<=N-1;j++){ //j表要看幾個節點
for( var i=1; i <= N - j; i++){//i表從誰開始看
for( var k=i; k<=j; k++){ //k表示root
tmp = cost[i][k-1]+ cost[k+1][i+j];// 佐子數的內部路徑長+ 右子樹的內部路徑長
if (tmp < [i][i+j]){
cost[i][i+j] = tmp;
best[i][i+j] = k;
}
}// triple operation
tmp = 0;
for (var k=i; k<= i+j; k++){
tmp = tmp + freq[k];
//i~i+j的freq累加變成第26行的tmp
}// 左子樹接到k下面
cost[i][i+j] = cost[i][i+j] + tmp;
// 左、右子樹獨立時的cost
}
}
comic + real face