3.5 时间复杂度

 

void Func2(int N)
{
    int count  = 0;
    for (int k = 0;k<2*N;++k)
    {
         ++count ;
    }
    int M = 10;
    while(M--)
    {
        ++count;
    }
    printf("%d\n",count);
}

 基本操作执行了2N+10次,通过推导大O阶方法,时间复杂度O(N)

void Func3(int N, int M) {
 int count = 0;
 for (int k = 0; k < M; ++ k)
 {
 ++count;
 }
 for (int k = 0; k < N ; ++ k)
 {
 ++count;
 }
 printf("%d\n", count);
}

 执行了M+N次,有两个未知数M和N,O(N+M)

void Func4(int N) {
 int count = 0;
 for (int k = 0; k < 100; ++ k)
 {
 ++count;
 }
 printf("%d\n", count);
}

 执行10次 O(N+M)

const char * strchr ( const char * str, int character );

 最好执行1次,最坏执行N次,时间复杂度看最坏,为O(N)

void Bubblesort (int*a , int n)
{
	assert(a);
	for(size_t end = n;end>0--end)
	{
		int exchange = 0;
		for(size_t i = 1;i<end;++i)
		{
			if(a[i-1]>a[i])
			{
				Swao(&a[i-1],&a[i])
				exchange = 1;
			}
		}
		if(exchange == 0)
		  break;
	}
}
实例 5 基本操作执行最好 N 次,最坏执行了 (N*(N+1)/2 次,通过推导大 O 阶方法 + 时间复杂度一般看最坏,时间复杂度为 O(N^2)
int BinarySearch(int* n ,int n ,int x)
{
	assert(a);
	
	int begin = 0;
	int end =  n;
	while(begin<end)
	{
		int mid = begin + ((end - begin)>>1);
		if(a[mid]<x)
		  begin = mid + 1;
		else if(a[mid]>x)
		  end = mid;
		else
		return mid;
	}
	return -1;
 } 

最好情况O(1)

最坏情况O(log2N)

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

 O(N),递归操作了N次

long long Fac(size_t N)
{
	if(0==N)
	   return 1;
	for (size_t i = 0;i<N;++i)
	{
		printf("%d",i);
	}
	printf("\n");
	return Fac(N-1)*N;
}

O(N*N)

递归算法的时间复杂度计算

1.每次函数调用是O(1),就看其递归次数

2.每次函数调用不是O(1),那么就看其递归调用中次数的累加、

long long Fib(size_t,N)//斐波那契数列 
{
	if(N<3)
	  return 1;
	reuturn Fib(N-1)+Fib(N-2);
}

 形成二叉树结构的递归调用

最后一层 2^(n-1) 累加且忽略得O(2^N)

 

int missingNumber(int* nums, int numsSize){
    int sum = 0;
    for(int i = 0;i<numsSize+1;i++)
    {
        sum +=i;
    }
    for(int i = 0;i<numsSize;i++)
    {
        sum-=nums[i];
    }
    return sum;

}

异或法:相同为0,相异为1,无关顺序,设置x=0,与数组数字异或

int missingNumber(int* nums, int numsSize){
    int x = 0;   
    for(int i = 0;i<numsSize;++i)
    {
        x^=nums[i];
    }
    for(int i = 0;i<=numsSize;++i)
    {
        x^=i;
    }
    return x;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值