python3 list时间复杂度

本文通过解决力扣算法题中遇到的问题,探讨了Python3列表(list)的时间复杂度。介绍了列表作为线性数据结构,其over-allocate特性以及引用数组的本质。列举了列表常见操作如遍历、删除、插入、访问和尾部添加的时间复杂度,指出其不适合频繁进行插入、删除操作。同时,文章提及空间复杂度的概念,指出列表的空间复杂度与其长度直接相关。

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

一、引题

本周在做力扣上的算法题(删除排序数组中的重复项)时,遇到了超出时间限制的问题,后来才知道是我设计的算法时间复杂度过高,于是我就对list的各个基本操作和常用函数的复杂度作了个了解。

二、背景知识

1.数组是一种线性表结构,其用一块连续的内存空间,来存储一组具有相同类型的数据
2.时间复杂度,也叫做渐进时间复杂度,通常用大O公式书写,表示代码的执行时间随数据规模增长的变化趋势,而非真正的执行时间。因此大O关注的是变化趋势。

三、列表(list)特点

1.底层基于数组实现
python list本质上是一个over-allocate的数组,啥叫over-allocate呢?就是当底层数组容量满了而需要扩充的时候,python依据规则会扩充多个位置出来。比如初始化列表array=[1, 2, 3, 4],向其中添加元素23,此时array对应的底层数组,扩充后的容量不是5,而是8。这就是over-allocate的意义,即扩充容量的时候会多分配一些存储空间。这样做的优点当然是提高了执行效率,否则每次添加元素,都要对底层数组进行扩充,效率是很低下的。另外,当列表存储的元素在变少时,python也会及时收缩底层的数组,避免造成内存浪费。这里可以通过对列表的实践,验证扩充与收缩的过程(通过 sizeof()或sys.getsizeof()查看内存变化,并推算容量值)。

2.属于引用数组

>>> a = [1, 2, 3, 4]
>>> a.__sizeof__()
72
>>> b = ['hello', 'world', 'mac']
>>> b.__sizeof__()
64
>>> c = [int('10'), str(8)]
>>> c.__sizeof__()
56
>>> d = 23
>>> 
>>> l
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值