读书笔记——数据结构(2)运行时间中的对数

某些分支算法将以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;
	}
}


原文地址:https://www.cnblogs.com/wlsandwho/p/4202185.html