1. 程式人生 > 其它 >聯機演算法和離線演算法[Alg_001]

聯機演算法和離線演算法[Alg_001]

一、聯機演算法

1、定義

也叫線上演算法,在演算法執行過程中的任意時刻,只對要操作的資料進行一次掃描,掃描完成後便此後不再對已經操作過的資料進行儲存和記憶。

這種演算法有種特點:如果資料是儲存在磁碟或者磁帶上,便可以順序地讀取,無需在主存中儲存資料的任何部分。

 

2、舉例

在處理最大子序和的問題中,存在一種聯機演算法,具體實現如下(基於C):

 1 int MaxSubsequenceSum(const int A[ ], int N) {
 2     int TempSum, MaxSum;
 3 
 4     TempSum = MaxSum = 0;
 5     for (int
i = 0; i < N; i++) { 6 TempSum += A[i]; 7 8 if (TempSum > MaxSum) { 9 MaxSum = TempSum; 10 } 11 else if (TempSum < 0) { 12 TempSum = 0; 13 } 14 } 15 16 return MaxSum; 17 }
 

可見,該演算法的在執行過程中只對序列進行一次掃描,並且無需記憶已經操作過的資料,這就是聯機演算法,它對已經讀入的資料,當即就可以給出最大子序和。

此外可以注意到,該演算法的時間複雜度為​,空間複雜度為​,即線性時間常量空間,滿足這一條件的聯機演算法幾乎可以認為是完美的演算法。

 

二、離線演算法

1、定義

也叫離線演算法,在演算法執行前所有的輸入資料已知,換句話說,對於一個離線演算法,在開始時就需要知道問題的所有輸入資料,和需要進行的所有操作,而且在解決一個問題後就要立即輸出結果。

 

2、舉例

同樣是序列最大子序和的問題,如下采用的演算法便是離線演算法,具體實現(基於C):

 1 int MaxSubsquenceSum(const int A[], int N) {
 2     int TempSum, MaxSum;
 3     
 4
MaxSum = 0; 5 for (int i = 0; i < N; i++) { 6 TempSum = 0; 7 for (int j = 0; j < N; j++) { 8 TempSum = A[j]; 9 10 if (TempSum > MaxSum) { 11 MaxSum = TempSum; 12 } 13 } 14 } 15 16 return MaxSum; 17 }

 

可以看出,在演算法執行過程中,需要不止一次地對資料進行掃描,雖然就空間複雜度而言,依然是​,但其需要對資料進行記憶 ,需要把全部資料讀入主存中。此外,演算法的時間複雜度為​,相較於上文中的聯機演算法就稍遜一籌。

 

三、理解

由於對資料的處理方式不同,聯機演算法在結果的產生上便形成了較為明顯的區別:

對聯機演算法而言,中途每一次讀入資料產生的結果都是滿足要求的結果,其結果的產生是基於對當前及過去的所有輸入,可以理解為:“熱炒熱賣”、“炒多少,賣多少,炒好一盤上一盤”,相當於炒菜,這也正和“線上演算法”中“線上”的意義不謀而合。

而離線演算法則是利用所有的資料參與計算,最終得到一個結果,其時間複雜度是非線性的,需要對資料多次掃描,無法像聯機演算法一樣順序讀入並出結果,可以理解為:“菜全部做好了再開始營業”,相當於自助餐廳,Ready。