欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

时间复杂度————被list.insert坑了

程序员文章站 2022-05-09 11:16:20
今天被一个很简单的坑到了,还想了很长时间,insert 函数,真的知道它内部执行的操作吗? 开始其实是在看一本算法的书,书里面给了两段工作内容差不多的伪代码 第一段如下: 第二段如下: 最开始感觉第二中代码中计算量不是应该比第一段多了一个计算长度的部分吗?应该是最二种时间花费更多,事实上len(da ......

今天被一个很简单的坑到了,还想了很长时间,insert 函数,真的知道它内部执行的操作吗?

开始其实是在看一本算法的书,书里面给了两段工作内容差不多的伪代码

第一段如下:

data = []
while 还有数据:
    x = 下一数据
    data .insert(0,x) # 把新数据加到表的最前面

第二段如下:

data = []
while 还有数据:
    x = 下一数据
    data.insert(len(data),x)  # 新数据加在最后

 最开始感觉第二中代码中计算量不是应该比第一段多了一个计算长度的部分吗?应该是最二种时间花费更多,事实上len(data)消耗的时间或者说时间复杂度是一个常量级别的,几乎可以忽略

这个地方问题点不是在len(data)上,而是在insert 的执行上,insert 如果从使用上,作用上来思考,超级简单,就是一个插入,但是这个方法中间的执行,却不是一个常量级的时间复杂度,

是一个线性关系,根据插入的位置和data的大小来确定,但是上面列举的第一种代码,插入的位置刚好是头部,也就是最前面,简单思考一下如果做一个插入操作,不用insert方法,自己写一个插入的方法,

就会是把从插入位置到最后一个元素全部向后挪动一位,这个时候时间可以看出来时间花费还是很大的,insert(0,x) 时间复杂度是o(n),而insert (-1,x)时间复杂度是o(l)

第二种代码时间复杂度计算是o(n),第一种代码时间复杂度计算是o(n^2),

 

总结一下,其实这个坑是因为忘记了insert操作其实也是一种遍历操作,需要花费的时间不是常量级,而是线性级