附Demo时间复杂度到底是如何计算的?

Posted chenry777

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了附Demo时间复杂度到底是如何计算的?相关的知识,希望对你有一定的参考价值。

首先我们要知道,在一个工程中,时间复杂度主要可能存在于2个地方:大循环和网络IO,这是经验,下面让我们分情况来讨论对于各种场景下的时间复杂度,到底是该如何计算的?

首先我们来看张图:
在这里插入图片描述
对于常见的时间复杂度,它们的大小关系为:
O(1) < O(log(n)) < O(n) < O(nlog(n)) < O(n2) < O(nx) (x > 2)

一、O(1)

小技巧:只要循环是确定的,那么这段代码块的时间复杂度就是O(1)

for (int i = 0; i < 3; i++) { // 在第4次的时候结束 跳出 i=3 (0 1 2 3)
    a = a + 1;            //这里会运行3次  O(3) => O(1)
}

二、O(log(n))

小技巧:循环条件不确定,循环体内做乘法或者触发改变循环条件的,时间复杂度就是O(log(n))

二分查找的时间复杂度就是这个哦

while (i <= n) {
    i = i * 3;        //  O(logn)
}

三、O(n)

显而易见,循环会随着n的变化而改变,这种场景的时间复杂度是O(n)

for (i = 0; i < n; i++) {
    a = a + 1;     
}

四、O(nlog(n))

在复杂度为log(n)的循环外层再套一层循环,时间复杂度就是O(nlog(n))

for (int j = 0; j < n; j++) {
    while (i <= n) {
        i = i * 2;
    }
}

五、O(n2)

小技巧:注意有个规律,有加减法的时候,找次数最高的那个

冒泡排序的时间复杂度就是这个哦

for (i = 0; i < n; i++) {    // 乘法 n次
    for (int j = 0; j < n; j++) {        //n次
        a = a + 1;            //运行了n^2次     时间复杂度:O(n^2)
    }
}

for (i = 0; i < n; i++) {    // 乘法 n次
    for (int j = i; j < n; j++) {        //n次
        a = a + 1;            //运行了多少次?	n*(n+1)/2 => O(n^2); => (n^2+n)/2 

    }
}

除了以上的5种常见情况外,在工程开发中,往往会有着大量的网络IO交互,比如RPC远程服务调用、HTTP接口访问、访问数据库等,这些都有可能是造成接口访问时间过长的瓶颈所在。那么平时该如何检测这些地方的时间损耗呢?

有一种常用的办法:

我们可以在网络IO的前后计算当前的时间戳:System.currentTimeMillis()
在外层套一个循环多统计几次,对统计的前后时间戳之差求和后,求平均

这样就能大概定位到"慢执行"的位置了

你学会了吗? O(∩_∩)O

以上是关于附Demo时间复杂度到底是如何计算的?的主要内容,如果未能解决你的问题,请参考以下文章

分享几个实用的代码片段(附代码例子)

分享几个实用的代码片段(附代码例子)

论如何设计一款端对端加密通讯软件

如何写一套下拉刷新的控件?《MJRefresh原理浅析》(附Demo下载地址)

Jetpack从入门到精通全家桶(含项目实战 附Demo)

以下代码片段的时间复杂度是多少?