时间复杂度的计算

一.什么是时间复杂度

时间复杂度的定义:时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数. 时间复杂度常用大O表述,不包括这个函数的低阶项和首项系数。

这段定义比较不好理解,我们这样去解释时间复杂度:时间复杂度就是用来描述算法运行快慢的量;比如一段代码之中,我们要处理的数据总量为x,为了达到某种目的(比如增删改查排等等目的),所需要的计算次数为y,则y与x之间存在的关系,可以用时间复杂度来表达;

比如y与n的对应关系为y=ax+b,(a为系数b为常数)时间复杂度就是O(n);

对应关系为y=ax^2+bx+c,时间复杂度就是O(n^2)

对应关系为y=a,与x无关,时间复杂度就是O(1)

对应关系为y=loga x(即a^y=x),时间复杂度就是O(logn)   等等…………

二.时间复杂度的比较

从小到大排列时间复杂度的大小为:
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<……O(a^n)<O(n!)
时间复杂度在O(n)即以上速度为慢,在O(logn)即以下速度为极快

三.时间复杂度的计算

我们来举几个例子:
1.我们要在一组无序的数组之中找到一个自己要的值:这个数的位置我们不确定,因此我们只能遍历这个数组,找到我们想要的数字,遍历数组的话需要将每个数字都和想要的值进行比较,直到找到我们想要的值为止,因此时间复杂度为O(n);
2.我们要在一个有序已知长度的数组之中找到一个自己想要的值:这次我们得到的数组是一个有序的数组,因此我们可以使用二分法来找我们想要的值,判断中间数字与我们想要值的大小关系,排除一半的数字,这样我们最多比较logn次就能找到我们想要的数字,因此这段代码的时间gn);
3.我们现在要求1到n相加的总和:我们可以依次从1加到n,这样需要加n-1次就能得到我们想要的结果,时间复杂度为O(n),但是我们也可以直接使用等差数列的求和公式(n+1)n/2这样只需要计算一次时间复杂度为O(1),时间复杂度明显低于前者;

四.时间复杂度计算实例

1.计算这段算法的时间复杂度
void fun(int n){
    int i=1;
    while(i<=n)
        i*=2;
}
我们首先要找到数据总量x与计算次数y,在这段算法之中,数据总量为n,n无穷大时,计算y次时i的值为2^(y-1),2^(y-1)~n,因此时间复杂度为O(logn);
2.计算这段代码的时间复杂度
void fun(int n){
    int i=0;
    while(i*i*i<=n)
        i++;
}
  这段算法中数据总量仍为n,计算y次时进入while循环处i的值为y-1,因此(y-1)^3~n,时间复杂度为O(三次根号n)
3.n为正整数,最后一行语句的频度在最坏的情况下是多少
for (i=n-1;i>1;i--)
    for(j=1;j<i;j++)
        if(A[j]>A[j+1])
            A[j]与A[j+1]对换
最坏的情况下就是A数组逆序,if循环每次都满足条件执行,可见第一次for循环执行i-1次第二次执行i-2次,一直减到i为1,因此时间复杂度为O(n^2)
4.求最后一行代码的执行次数
int m=0,i,j;
for(i=1;i<=n;i++)
    for(j=1;j<=2*i;j++)
        m++;
当i为1时,最后一行代码执行的次数为2,i为2时,最后一行代码执行次数为4……当i为n时,最后一行代码执行的次数为2n,因此总共的执行次数为n(n+1)
5.求这段代码的时间复杂度
x=2;
while(x<n/2)
x=2*x;
第一次进入while循环时x值为2,第二次进入时x为2^2……第n次进入循环时x的值为2^x,因此2^x~n,时间复杂度为O(logn)
6.求这段代码的时间复杂度
x=0;
while(n>=(x+1)*(x+1))
x=x+1;
 第一次进入循环的时候x+1的值为1;第x次进入循环的时候x+1的值为x,x^2~n,因此时间复杂度为O(根号n)
  • 45
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值