聯機演算法:
在任意時刻,演算法對要操作的資料唯讀入(掃瞄)一次,一旦被讀入並處理,它就不需要在被記憶了。而在此處理過程中演算法能對它已經讀入的資料立即給出相應子串行問題的正確答案。具有這種特性的演算法叫做聯機演算法(on-line algorithm)。
該演算法僅需要常量空間並以線性時間執行,因此聯機演算法幾乎是完美的演算法。
遞迴呼叫的準則:
1. 基準情形。 不用遞迴就能求解的情形。
2.不斷推進。
3.合成效益法則。 在一次求解中,對同一示例,切勿在不同遞迴中 做重複行工作。 如下:
求factorial
方法一:
long factorial(int n)
方法二:
long factorial(int n)
方法二中 factorial(n-1)+ factorial(n-2) 做重複性工作,不符合第三條準則。
測試**,求乙個 序列中 最大的子串行之和
#include #include using namespace std;
//遞迴呼叫 解決
int max(int x, int y, int z)
int maxsub(const vector& a, int left, int right)
int mid = (left+right)/2;
int maxleftsum = maxsub(a, left, mid);//左右子串行遞迴
int maxrightsum = maxsub(a, mid+1, right);
int maxleftborder = 0, tmpleft = 0;
for (int i = mid; i >= left; i--) }
int maxrightborder = 0, tmpright = 0;
for (int i = mid+1; i <= right; i++) }
return max(maxleftsum, maxrightsum, maxrightborder+maxleftborder);
}
//聯機演算法
int max_sub(const vector& a, int left, int right)//left right 分別指下標
return maxsum;
}
int main()
; vectora(arr, arr+9);;
cout<
通過上例可看出
聯機演算法
優點:占用空間少,所用時間少
缺點:不宜設計,正確性不易觀察,同時附加保留資訊較少
遞迴:優點:思路清晰
缺點:占用大量的棧
聯機演算法不僅在 **量上 遠遠 少於遞迴的方法,同時 在占用空間(遞迴占用大量的棧)和執行時間上都遠遠優於遞迴的方法。
演算法分析與設計 遞迴與尾遞迴
什麼是遞迴?遞迴最恰當的比喻,就是查詞典。我們使用的詞典,本身就是遞迴,為了解釋乙個詞,需要使用更多的詞。當你查乙個詞,發現這個詞的解釋中某個詞仍然不懂,於是你開始查這第二個詞,可惜,第二個詞裡仍然有不懂的詞,於是查第三個詞,這樣查下去,直到有乙個詞的解釋是你完全能看懂的,那麼遞迴走到了盡頭,然後你...
演算法設計與分析 遞迴
遞迴是一種技術手段,並不嚴格算是一種演算法,是指程式直接間接呼叫自身的程式設計技巧。遞迴需要有邊界條件,遞迴前進段和遞迴返回段。1 當邊界條件不滿足時,遞迴前進 2 當邊界條件滿足時,遞迴返回。ps 在使用遞迴策略時,必須有乙個明確的遞迴結束條件,成為遞迴出口,否則將無限進行下去 遞迴的缺點 遞迴演...
演算法分析與設計3 遞迴
任何乙個可以用計算機求解的問題所需的計算時間都與其規模n有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。分治法的設計思想是,將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。如果原問題可分割成k個子問題 1 k n 且這些子問題都可解,並可利用這些子問...