什么是联机算法

如果在任何时刻,算法都能对它已经读入的数据给出子序列问题的正确答案,具有这种特性的算法叫做联机算法。仅需要常量空间并以线形时间运行的联机算法几乎是完美的算法。

一个经典的问题:求最大子序列和的算法就是这样一个完美的算法,给定一个数组(不妨设为整形),求出一个子序列,使得子序列中的元素之和为最大。例如 {4,3,-8,2,6,-2,1},则 {2,6} 子序列即为所求。

这个问题有很多种算法可以解决,但是最好的是一个线形时间常量空间的联机算法,算法如下:

java 代码
  1. int maxSubSum (int[] a, int size)    
  2. {   
  3.      int maxSum = 0, thisSum = 0;   
  4.      int start = 0, end = 0;   
  5.         
  6.      for ( int j = 1; j <= size; j++ )   
  7.      {   
  8.            thisSum += a[j-1];   
  9.              
  10.           if (thisSum > maxSum)   
  11.           {   
  12.                maxSum = thisSum;    
  13.                end = j;   
  14.           }   
  15.           else if (thisSum < 0)   
  16.           {   
  17.               thisSum = 0;  
  18.               maxSum = 0; 
  19.               start = j + 1;   
  20.           }   
  21.      }   
  22.   
  23.       System.out.println(“最大子序列从第” + start + “个元素到第” + end + “个元素”);  
  24.       System.out.println("最大子序列和为“ + maxSum);   
  25.   
  26.       return maxSum;   
  27. }   
  28.            

可以看出这个算法是线形时间O(N)的,且只对数据进行一次扫描,一旦a[j]被读入并被处理,它就不需要再被记忆。因此如果数组在磁盘或磁带上,它就可以被顺序读入,在主存中不必存储数组的任何部分。所以这个算法是一个几乎完美的联机算法

你可能感兴趣的:(算法,J#)