时间复杂度

对于这串代码实际所花时间是100次 我们用大O表示则是O(1);我们可能有疑问如果所需要的是200次300次包括几万次来说 ,我们仍然用O(1)来表示 ,计算机cpu现在家用基本等达到每秒50亿次 

即使它取到最高的32位来说他所含有的时间复杂度仍然是O(1)

kaka今天讲解时间复杂度 

首先一点 什么是时间复杂度 我们为什么要去考虑时间复杂度  我们如何去计算时间复杂度  ?


我们引入时间复杂度的概念 就是去计算算法的基本操作的执行次数 

void Dnc(int N)
{
	int count =0
		for (int i = 0; i < N; i++)
		{
			++count;
			for (int j = 0; j < N; j++)
			{
				++count;
			}
		}
	for (int k = 0; k < N; k++)
	{
		++count;
	}
	int M = 10;
	while (M--)
	{

		++count;
	}
}

对于这串代码 我们所执行的次数 可以说是Dunc()=N^2+2*N+10

但是通常我们在写代码时我们是不用去看整串代码的运行次数的 ,我们只要去看个大概就行,

因此我们应用大O渐进表示法

1 ,用常数1取代运行时间中的所有加法常数。

2、在修改后的运行次数函数中,只保留最高阶项。

3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

使用大O的渐进表示法以后,Func1的时间复杂度为:O(N^{2})

当我们看Dunc()时如果 N=1000时,那么就是1002010我们用1000000,并不比它相差多少

所以我们用O(n^2)来表示

常见的时间复杂度举例

void Dunc(int N, int M)
{
	int count = 0;
	for (int i = 0; i < N; i++)
	{
		count++;
	}
	for (int j = 0; j< N; j++)
	{
		count++;
	}

}

这串代码的时间复杂度就是O(M+N),我们暂时不能确定到底是o(M)大还是o(N)大如果 O(M)远大于O(N)时间复杂度就是 O(M)为之相反O(N);

void Dunc(int M)
{ int count=0;
 for(int i=0;i<100;i++)
{

 count++;
}
printf("%d" count);




}

对于这串代码实际所花时间是100次 我们用大O表示则是O(1);我们可能有疑问如果所需要的是200次300次包括几万次来说 ,我们仍然用O(1)来表示 ,计算机cpu现在家用基本等达到每秒50亿次 

即使它取到最高的32位来说他所含有的时间复杂度仍然是O(1)

void Buddle(int *a,int n)
{  assert(a);
   for(size_t end=n;end>0;--end)
{     int exchange = 0;
      for(size_t=1;i<end;i++)
     {         if(a[i - 1] > a[i])
	
              Swap(&a[i - 1], &a[i]);
				exchange = 1;


       }    if(exchange==0)
              break;  


}




}

对于这串代码 最好的情况就是有序,但是我们在一般是要考虑最坏的情况  就是每个数字两两互相交换  就需要(n-1)n/2 那么时间复杂度就是O(n^2)

int hedge(int* a, int n, int x)
{
	assert(a);
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
		int mid = begin + ((end - begin) >> 1);
		if (a[mid] < x)
			begin = mid + 1;
		else if (a[mid] > x)
			end = mid - 1;
		else
			return mid;

	}
}

对于二分查找最好的就是直接找到这个数字但是最坏情况就是找不到或者在一点相当小的空间里

那么就是n/2/2/2/2/2/2/2/2/2/2/2/........=1;那么它N=log(n)

long long Doc(size_t N)
{
	if (N == 0)
	{
		return 1;
	}
	return Doc(N - 1) * N;
}

在递归中 我们在不停的调用 Doc(n),Doc(n-1),......直到Doc(2),Doc(1)调用了n次;

那么这段递归的函数来说就是O(n);

long long Doc(size_t N)
{
	if (N == 0)
	{
		return 1;
	}
	return Doc(N - 1) * Doc(N - 2);
}

对于这串代码我们反复在调用O(N),每串调用中都在延长函数数的调用,因此时间复杂度是O(n^2)

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值