第一章:基本概念
1.概念:概念這個東西太有深度了,目前還沒有掌握。通過實例來了解吧。
2.例1:1.圖書館放書問題。遇到這種問題,不僅要考慮如何放,還要考慮如何拿,不能只顧放的時候輕鬆,正所謂前人栽樹,後人乘涼。在遇見問題是,一定要思考全。
3.解決問題的效率:a.跟數據的組織方式有關。
b.跟空間的利用效率有關。
比如實現一個函數PrintN。我們可以用for循環實現,也可以用遞歸實現。但當n過大時(比如100000),遞歸實現就有可能報錯。
4.例2:計算多項式在定點x的值,有兩種方法:a.total +=a[i]*(pow,x);
b.p = a[i-1]+ x * p;
明顯,第二種方法更好,第一個的時間複雜度為n的三次方,而第二個僅為n。這個差距是非常恐怖的。
5.複雜度從1,logn,n,nlogn,n的平方,n的立方,2的n次方,n的階層依次上升,所以我們要儘可能把演算法設計成靠前的。
6.最後這是第一章有關演算法設計非常好的實例,求最大子列和的問題。有四種方法,可以很直觀的感受的演算法的魅力,真的那些設計演算法的人,我把花半天才能理解一個演算法,而他們卻能把他們寫出來,真是太厲害了(我花半天應該很大一部分原因是因為基礎不好,加上腦子反應慢)。
最後附上四種不同方法的解題程式碼:
a.這是第一種最笨的方法,不過也是我能想出來的方法。
void Max (int a[],int N)
{
int this,max = 0;
int i,j,k;
for (i = 0;i < N;i++){
for (j = i;j < N;j++){
this = 0;
for (k = i;k <= j;k++){
this += a[k];
}
printf("this is %d\n",this);
if (this > max) max = this;
}
}
printf("max is %d\n",max);
}
b.第二章方法就是簡化了一些重複的步驟,卻可以節省n倍的時間。
void Max1 (int a[],int n)
{
int this,max;
int i,j;
for ( i = 0; i < n;i++){
this = 0;
for (j = i;j < n;j++){
this += a[j];
if (this > max) max = this;
}
}
printf("max is %d\n",max);
}
c.這是用了分而治之的方法,先分再和,用了遞歸的思想,我認為遞歸這個很打腦殼,可能是因為腦子笨的原因加上程式碼寫少了。
#include <stdio.h>
int max (int a, int b, int c)
{
int temp = a;
if (a < b) {
temp = b;
}
if (temp < c) {
temp = c;
}
return temp;
}
int find (int list[], int left, int right)
{
int MLS,MRS;
int MLBS,MRBS;
if (left == right){
if (list[left] > 0){
return list[left];
}else{
return 0;
}
}
int center = (right + left) / 2;
MLS = find (list,left,center);
MRS = find (list,center+1,right);
MLBS = 0;
MRBS = 0;
int i;
int LBS = 0;
int RBS = 0;
for (i = center;i >= left;i--){
LBS += list[i];
if (LBS >MLBS ){
MLBS = LBS;
}
}
for (i= center +1;i <= right;i++){
RBS += list[i];
if (RBS > MRBS){
MRBS = RBS;
}
}
return max(MLS,MRS,MLBS+MRBS);
}
int Div(int list[],int n)
{
find (list,0,n-1);
}
d.這是最nb的解法,時間複雜度僅為n,也就是說,僅僅是花了把每個數讀一遍的時間,就解出來了,真心佩服。
void Max2 (int a[], int n){
int this,max;
int i;
for (i = 0; i < n;i++){
this += a[i];
if(this > max){
max = this;
}else {
this = 0;
}
}
printf("max is %d\n",max);
}
第一章的總結就寫到這裡吧,期待第二章!

