时间复杂度与空间复杂度

1,时间复杂度

时间复杂度:计算大概的语句运算次数。

大O的渐进表示法:

(1)用常数1代替所有加法常数。

(2)只保留最高阶项。

(3)如果最高阶项存在且不是1,则去掉与这个数相乘的常数。(3n^2=n^2)

例子(子函数部分):二分查找(必须是在排序好的数组中进行)

时间复杂度是:O(log 2 n)

#include<stdio.h>
fun(int k, int len,int a[])
{
	int mid;
	int left = 0;
	int right = len - 1;
	while (left < right)
	{
		mid = (left + right) / 2;
		if (a[mid] == k)
		{
			break;
		}
		else if (a[mid] > k)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	return mid;
}

例2:斐波那切数列

(1)反例:

时间复杂度是:O(2^n)

#include<stdio.h>
long long fun(size_t n)
{
    return n < 2 ? n : fun(n - 1) + fun(n - 2);
}

//因为他的时间复杂度是n^2,导致时间占用过长。

(2)正例:

时间复杂度是:O(n)

#include<stdio.h>
#include<stdlib.h>
long long* fib(size_t n)//size_t是无符号整数
{
    long long* fibarray =malloc(sizeof(long long) * (n + 1));
    //(n+1)是为了防止n=0,导致数组空间不够。
    //malloc需要stdlib.h头文件,且不会占用堆栈空间
    fibarray[0] = 0;
    fibarray[1] = 1;
    for (int i = 2; i <= n; i++)
    {
        fibarray[i] = fibarray[i - 1] + fibarray[i - 2];
    }
    return fibarray;
}
int main()
{
    //int n = 50;
    //long long* result = fib(n);
    //printf("%d", result[n]);
    //free(result);
    printf("%lld", *fib(10));
    return 0;
}

//以时间换空间

2,空间复杂度(不是重点)

空间复杂度:计算大概定义的变量数量

        

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值