数据结构与算法学习笔记(一)几个低时间复杂度的算法

几个低时间复杂度的算法:

(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/2xN/2
N为奇数时: xN=x(N1)/2x(N1)/2x

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的情况下,最后一行做了同样的工作。

点赞