对于同一个问题,如果我们采用时间复杂度低的算法进行求解,将会极大的提高计算时间,提高程序性能。
下面是我收集的一些常见时间复杂度低,效率高的函数。持续更新
求解最大子序列和,时间复杂度O(N)
#include <assert.h>
int MaxSubSequenceSum(const int a[], int n)
{
int maxSum = 0;
int thisSum = 0;
int i = 0;
assert(a);
assert(n > 0);
for (; i < n; ++i)
{
thisSum += a[i];
if (thisSum > maxSum)
maxSum = thisSum;
else if (thisSum < 0)
thisSum = 0;
}
return maxSum;
}
对分查找,时间复杂度O(logN)
#include <assert.h>
typedef int ElementType;
int BinarySearch(const ElementType a[], ElementType x, int n)
{
int low = 0;
int high = 0;
assert(a);
assert(n > 0);
high = n-1;
while (low <= high)
{
int mid = (low&high)+((low^high)>>1);
if (a[mid] > x)
high = mid-1;
else if (a[mid] < x)
low = mid+1;
else
return mid;
}
return -1;
}
欧几里得算法(求最大公因数),时间复杂度O(N)
int Gcd(unsigned int m, unsigned int n)
{
unsigned int rem = 0;
while (n)
{
rem = m%n;
m = n;
n = rem;
}
return m;
}
int Pow(int x, unsigned int n)
{
if (0 == n)
return 1;
if (n&1)//奇数
return Pow(x, n-1)*x;
else
return Pow(x*x, n>>1);
}
求∑aiXi,i从0到N,时间复杂度O(N)
//Horner法则
long int Horner(long int X, const int A[], unsigned int N)
{
long int Poly = 0;
unsigned int i = 0;
for (i = N; i >= 0; --i)
Poly = X*Poly + A[i];
return Poly;
}