- 常见符号
a. Θ—增长率相同
b. Ο—增长率小于等于—上界
c. Ω—增长率大于等于—下界
d. o—增长率严格小于
2.最大子序列问题
递归方法—分治策略—NlogN
联机算法—常量空间线性时间运行的在线算法–N
#include<cstdio>
#include<algorithm>
using namespace std;
int *arr;
int n;
void ReadInput()
{
scanf("%d", &n);
arr = new int[n];
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
}
int MaxSubsequenceSum(int begin, int end)
{
if (begin == end)
if (arr[begin] > 0)
return arr[begin];
else
return 0;
int MaxLeftSum, MaxRightSum;
int MaxLeftBorderSum, MaxRightBorderSum;
int LeftBorderSum, RightBorderSum;
int Center;
Center = (begin + end) / 2;
MaxLeftSum = MaxSubsequenceSum(begin, Center);
MaxRightSum = MaxSubsequenceSum(Center + 1, end);
LeftBorderSum = 0;
MaxLeftBorderSum = 0;
for (int i = Center; i >= begin; i--)
{
LeftBorderSum += arr[i];
if (LeftBorderSum > MaxLeftBorderSum)
MaxLeftBorderSum = LeftBorderSum;
}
RightBorderSum = 0;
MaxRightBorderSum = 0;
for (int i = Center + 1; i <= end; i++)
{
RightBorderSum += arr[i];
if (RightBorderSum > MaxRightBorderSum)
MaxRightBorderSum = RightBorderSum;
}
return max(max(MaxLeftSum, MaxRightSum), MaxLeftBorderSum + MaxRightBorderSum);
}
int MaxSubsequenceSum(int n)
{
int ThisSum, MaxSum;
ThisSum = MaxSum = 0;
for (int i = 0; i < n; i++)
{
ThisSum += arr[i];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
else if (ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}
int main()
{
ReadInput();
printf("%d\n", MaxSubsequenceSum(0, n - 1));
printf("%d\n", MaxSubsequenceSum(n));
return 0;
}
3.对分查找
二分法确定数组元素的索引—LogN
4.欧几里得算法求最大公因子—最坏情况下为1.44LogN
(如果M>N,则M mod N < M/2)
5.幂运算
递归的方法—LogN
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, n-1)*x;
}
6.分析结果
大多数情况下平均情况的计算比较复杂,一般按最坏情况处理。