python算法与数据结构(一)

本文深入浅出地介绍了时间复杂度和空间复杂度的概念,通过Python代码示例展示了如何分析不同循环结构的时间复杂度,如O(1)、O(n)、O(n^2)和O(logn)。同时,解释了在判断时间复杂度时,即使存在多个循环,也应考虑最高阶项,忽略低阶和常数项。此外,文章还提及空间复杂度的判断,如O(1)、O(n)和O(mn)。最后,强调了在优化算法时,可能需要牺牲空间换取时间效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间复杂度

定义:衡量代码运行时间的数据,一般用O来表示。

下面用代码来说明如何来观察时间复杂度。

>>> print('hello world')
#只打印了一次hello world,称做O(1)

>>> for i in rang(n):
    	print('hello world')
#一个循环,打印了n次hello world,称做O(n)

>>>for i in rang(n):
       for j in rang(n):
             print('hello world')  
#两个循环嵌套,打印了n次hello world,称做O(n^2)

>>> for i in rang(n):
        for j in rang(n):
            for k in rang(n):
                print('hello world')
#两个循环嵌套,打印了n次hello world,称做O(n^3)

通过上面的例子可以明白我们在利用循环的次数来判断衡量O。

第一个例子没有循环,但是没有被写为0,是因为可以把这种情况当作单位1来理解,1不只是次数,而是一个单位。

>>>i=n
while i>0:
    print("hello world")
    i=i//2

例如这种,如果每次循环都除二,那么复杂度该怎么判断呢?
那么利用数学公式,循环次数即为log以2为底的n的对数。 将其简化,我们叫它的复杂度为O(logn)。

举一反三。

>>>print('hello')
   print('world')
   print('1')

>>>for i in range(n)
       print('hello')
       for j in range(n)
           print('world')

第一种由于没有循环,所以可以看做只有O(1),第二种,一层循环里套着一层循环,是不是要看做O(n+n^2)呢?

事实上,这是不用的。因为n^2远大于n,此时n可以被忽略,则第二种实际上的复杂度为O(n^2)。

所以利用循环来判断判断时间复杂度仅仅只是一个技巧。而不是方法。

判断时间复杂度的技巧

1.判断问题的规模n

2.判断循环,减半O(logn),嵌套K次O(n^K)

3.复杂情况根据执行状况来判断。

空间复杂度

定义:判断代码所占内存。

判断方法:代码包含几个变量。

1)几个(具体数量)复杂度为O(1)

2)列表长度为nO(n)

3)列表n行m列O(mn)

另外,我们常采取牺牲空间复杂度的办法来提交高效率,减少时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值