程式設計珠璣 第八章 習題

2021-06-09 21:21:07 字數 1257 閱讀 9193

8、修改分治演算法,使得遞迴的最壞效能為線性時間

程式設計珠璣裡面提示說,需要記錄last set index,於是我便記錄之,但是問題是,如此最壞是不能線性的,最好是o(n),就是左右都是第乙個節點的時候。

int subquadratic_conquer(int arry, int l, int r)

if (l == r)

int m = (l + r) / 2;

lmax = sum = 0;

for (int i = m; i >= l; i--) //跨邊界最大子向量在a中部分是a中包含右邊界的最大子向量

lmax = max(lmax, sum);

}rmax = sum = 0;

for (int j = m + 1; j <= r; j++) //跨邊界最大子向量在b中部分是b中包含左邊界的最大子向量

rmax = max(rmax, sum);

}return max(lmax + rmax, max(subquadratic_conquer(arry, sub_l, m), subquadratic_conquer(arry, m + 1, sub_r)));//返回3個總和中的最大者

}int main()

; int sub_max = subquadratic_conquer(a, 0, 5);

return 0;

}

9、全負數陣列,用求最大子向量求和的方式求最大元素的值:

這個問題很簡單了,因為全負數,任意數相加必然更小,要最大子串行,就不能加,然後找到最大值,但是不能用iter方式咯,就用求最大子串行的和的方式,如下。

int maximum(int arry, int n)

return maxsofar;

}

10、求最接近0的子向量

這個也不難,做另乙個陣列儲存cum,使得cum[i] = cum[i-1] + arr[i],arr為原始陣列。如果cum[l-1] = cum[n],那麼cum[l..n]就是最接近0子向量,這裡一定是0.但是,最接近0的子向量也很差不多,只要把所有的cum排序就是了,delta最小的就是了,整個演算法複雜度就是排序了。

sort(cum, cum + len); //對cum排序

int imin = cum[1] - cum[0];

for (int k = 1; k < len; k++)

return imin;}

第八章 習題

一 填空題 1 在c 的輸入輸出系統中,最核心的物件是 流 執行輸入和輸出操作的類體系叫做 流類 2 當實際進i o操作時,cin與 標準輸入裝置相關聯。3 c 的流類庫預定義了4個流,它們是 cin cout cerr 和 clog 4 使用檔案流類庫的程式必須用 include編譯指令將標頭檔案...

第八章習題

習題2 define crt secure no warnings include int main void else if ch t else else if num 10 0 num 0 putchar n return 0 疑問 printf n d n ch num 0 書上有這樣一句話 ...

程式設計珠璣第八章 演算法設計技術

本章就乙個小問題研究了四種不同的演算法,重點強調了這些演算法的設計技術,綜合本章內容,告訴我們 複雜深奧的演算法有時可以極大地提高程式效能。問題定義 具有n個浮點數的向量x,求出輸入向量的任何連續子向量的最大和。立方演算法 maxsofar 0 for i 0,n for j i,n sum 0 f...