【数据结构笔记】时间复杂度

时间复杂度

def func():
    a = 2 * 3

计算次数:1,时间复杂度:常数复杂度O(1).

def func(n):
    n = 10
    for i in range(n):
        a = 2 * 3

计算次数:n,时间复杂度:线性复杂度O(n).

def func(n):
    n = 10
    for i in range(n):
        for j in range(n):
            a = 2 * 3

计算次数:n_{}^{2},时间复杂度:多项式复杂度O(n_{}^{2}).

def func(n):
    for i in range(n):
        for j in range(i,n):   // i=0时,第二层循环执行n次;i=1时,第二层循环执行n-1次
            a = 2 * 3

计算次数:n + (n - 1)+... + 1 = \frac{(1 + n)*n}{2}.

时间复杂度:O(\frac{(1 + n)*n}{2}),在时间复杂度的表示中,为了方便,一般只保留最高次的项,且不保留系数,所以,上述代码的时间复杂度可以是O(n_{}^{2}).

def func(n):     // 递归
    n = 10
    if n <= 1: return n
    return func(n-1) + func(n-1)

时间复杂度:指数复杂度O(2_{}^{n}).

def func(n):     
    if n <= 1: return n
    return func(n//2)+1    // n除以2,再加一

时间复杂度:对数复杂度O(\log n),以2为底的log n.

def func(n):
    if n <= 1: return
    mid = n // 2
    for i in range(mid+1m,n):
        a = 1
    func(mid)

f(n) = f(\frac{n}{2}) + \frac{n}{2} = f(\frac{n}{4}) + \frac{n}{2} + \frac{n}{4}

f(n) = \frac{n}{2} + \frac{n}{4} + \frac{n}{8} ... \leqslant n

时间复杂度:渐进复杂度O(n).

a = []   // 全局数组a
def func(x):
    if x == 0:
        a.push(x)     // 如果传入的是0,则往a里放一个0
    else:
        while a.size() >  and x > 0:   // 如果传入的不是0,则从a里pop出x个
            a.pop()
            x -= 1

x == 0时,

        单次操作时间复杂度:O(1)

        n次操作时间复杂度:O(n)

x != 0时,

        单次操作时间复杂度:O(n)

        n次操作时间复杂度:O(n_{}^{2})

但是,总的pop次数不会超过全部push(x == 0)的次数,所以总体的复杂度为O(n).

在每一步的计算次数都不同的时候,往往我们直接考虑总体次数,就能想明白问题了。

时间复杂度:均摊复杂度O(n),也是线性复杂度

算法常数:计算次数的最高次项前面的系数,也可以是单语句的计算时间。

如果你的程序跑得慢

  • 是否时间复杂度不对
  • 是否常数太大

        在leecode上程序运行时间打败了多少人,这个评判标准仅供参考,并不具有绝对指导意义,因为程序运行时间除了和时间复杂度有关外,还和具体的数据规模挂钩,例如:

        O(10n_{}^{2})O(n_{}^{3}),在n等于2时,复杂度高的运行时间反而短。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DUANDAUNNN

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

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

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

打赏作者

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

抵扣说明:

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

余额充值