几个低时间复杂度的算法:
(1)最大子序列和问题
给定整数A[0]~A[N-1],可能有负数,求SUM(k=i;j)A[k]的最大值。
int MaxSubsequenceSum(const int A[];int N){
int ThisSum=0,MaxSum=0;
for(int i=0;i<N;i++){
ThisSum += A[i];
if(ThisSum > MaxSum){
MaxSum = ThisSum;
}else if(ThisSum < 0){
ThisSum = 0;
}
}
return MaxSum;
}
时间复杂度仅为O(N)
(2)欧几里得算法:计算最大公因数
求两个整数的最大公因数。
unsigned int GCD(unsigned int M,unsigned int N){
unsigned int Rem;
while(N>0){
Rem = M%N;
M = N;
N = Rem;
}
return M;
}
时间复杂度为O(logN)
不用考虑M和N谁大的问题,因为多一次循环就会调整为M大N小。
(3)幂运算
求一个整数的N次幂的常规思路是使用N-1次自乘,这样时间复杂度是O(N)
使用递归算法会更好:
N为偶数时: xN=xN/2∗xN/2
N为奇数时: xN=x(N−1)/2∗x(N−1)/2∗x
long int Pow(long int x,unsigned int N){
if(N == 0)
return 1;
if(N == 1)
return x;
if(N%2 == 0)
return Pow(x*x,N/2);
else
return Pow(x*x,(N-1)/2)*x;
}
时间复杂度为O(logN)
实际上N==1的这条代码也可以省略,因为在N=1的情况下,最后一行做了同样的工作。