聯機演算法和離線演算法[Alg_001]
阿新 • • 發佈:2022-04-03
一、聯機演算法
1、定義
也叫線上演算法,在演算法執行過程中的任意時刻,只對要操作的資料進行一次掃描,掃描完成後便此後不再對已經操作過的資料進行儲存和記憶。
這種演算法有種特點:如果資料是儲存在磁碟或者磁帶上,便可以順序地讀取,無需在主存中儲存資料的任何部分。
2、舉例
在處理最大子序和的問題中,存在一種聯機演算法,具體實現如下(基於C):
1 int MaxSubsequenceSum(const int A[ ], int N) { 2 int TempSum, MaxSum; 3 4 TempSum = MaxSum = 0; 5 for (inti = 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 4MaxSum = 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。