某些分支算法将以O(logN)时间运行。
一般法则:
如果一个算法用常数时间(O(1))将问题的大小削减为其一部分(通常是1/2),那么该算法就是O(logN)。
另一方面,如果使用常数时间知识吧问题减少一个常数(如将问题减少1),那么这种算法就是O(N)的。
三个例子:
1.对分查找(二分查找)
给定一个整数X和整数A0,A1,……,AN-1,后者已经预先排序并在内存中,求使得Ai=X的下表i,如果X不在数据中,则返回i=-1。
int BinarySearch(const ElementType A[],ElementType X,int N)
{
int Low,Mid,High;
Low=0;
High=N-1;
while(Low<=High)
{
Mid=(Low+High)/2;
if(A[Mid]<X)
{
Low=Mid+1;
}
else if(A[Mid]>X)
{
High=Mid-1;
}
else
{
return Mid;
}
}
return -1;
}
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;
}
3.幂运算
计算一个整数的N次幂
long int Pow(long int X,unsigned int N)
{
if(N==0)
{
return 1;
}
if(N==1)
{
return X;
}
if(IsEven(N))
{
return Pow(X*X,N/2);
}
else
{
return Pow(X*X,N/2)*X;
}
}