一文带你理解算法时间复杂度的计算(有案例)

在开始学习前,我们需要明确:时间复杂度不存在特定的时间单位。因此我们常常抛弃一些前导的常数与一些低阶项,从而来计算大O的运行时间。由于大O是一个上界,我们绝不能低估程序的运行时间。(摘自《计算机科学丛书——数据结构与算法(java语言描述)》)

循环中的时间复杂度计算

先来看一个简单的例子

int count = 1
for (int i=1;i<=n;i++){
    for (int j=1;j<=n;j++){
        System.out.println(count);
        count+=1;
}
//问System.out.println(count);语句的时间复杂度;
//可以这样理解:对于每一个外循环,内循环执行n次,而一共有n个外循环,因此时间复杂度为O(n^2)

是不是很容易理解?

我们再来看一个容易混淆的点,对上面的例子我们稍加改动:

int count = 1
for (int i=1;i<=n;i++){
    for (int j=1;j<=i;j++){
        System.out.println(count);
        count+=1;
}
//可以看到j的条件发生了变化,但此算法时间复杂度仍为O(n^2)
//而事实上,j所执行的次数确实变少了,j=1+2+3+4+5+...+n=n(n+1)/2,在大O表示法中,我们其实往往会忽略常数项的存在。

来看一个需要一些数学计算的例子:

一个小小的前置知识:

int count = 1
for (int i=1;i<=n;i++){
    for (int j=1;j<=i;j++){
        for (int k=1;k<=j;k++){
          System.out.println(count);
            count++;  }
    }
}
//问System.out.println(count);语句的时间复杂度;

折半中的时间复杂度计算

常见的二分查找,或者更通俗来说,以倍数前进的时间复杂度表达式中会出现

其实不难理解,假设你原有8个数需要遍历,此时时间复杂度为O(n),而变为“乘二“或”二分”之类的,你便只需要遍历3次

顺序结构中的算法复杂度计算:

将各个语句的运行时间求和即可(这意味着,其中的最大值就是所得的运行时间)

int count = 1
for (int i=1;i<=n;i++){
       System.out.println(count);
            count++;}//此段时间复杂度为O(n)
 for (int i=1;i<=n;i++){
    for (int j=1;j<=i;j++){
        System.out.println(count);
        count+=1;}}//此段时间复杂度为O(n^2)
//取大值即可

if-else语句中的算法复杂度计算:

原则:一个if-else语句的运行时间从不超过判断的运行时间再加上(if 后语句,else后语句)中运行时间长者的总的运行时间。

if(n>=0){
    for (int i=1;i<=n;i++){
        for (int j=1;j<=i;j++){
            System.out.println("输入数据大于等于0");}}}
else{
    for (int i=1;i<=n;i++){
       System.out.println("输入数据小于0");
}

由上所述的原则可知该算法复杂度为O(n^2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nnlee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值