python判断语句的复杂度_Python内置方法的时间复杂度(转)

本文翻译自Python Wiki

本文基于GPL v2协议,转载请保留此协议。

本页面涵盖了Python中若干方法的时间复杂度(或者叫“大欧”,“Big O”)。该时间复杂度的计算基于当前(译注:至少是2011年之前)的CPython实现。其他Python的实现(包括老版本或者尚在开发的CPython实现)可能会在性能表现上有些许小小的差异,但一般不超过一个O(log n)项。

本文中,’n’代表容器中元素的数量,’k’代表参数的值,或者参数的数量。

列表(list)

以完全随机的列表考虑平均情况。

列表是以数组(Array)实现的。最大的开销发生在超过当前分配大小的增长,这种情况下所有元素都需要移动;或者是在起始位置附近插入或者删除元素,这种情况下所有在该位置后面的元素都需要移动。如果你需要在一个队列的两端进行增删的操作,应当使用collections.deque(双向队列)

操作

平均情况

复制

O(n)

O(n)

append[注1]

O(1)

O(1)

插入

O(n)

O(n)

取元素

O(1)

O(1)

更改元素

O(1)

O(1)

删除元素

O(n)

O(n)

遍历

O(n)

O(n)

取切片

O(k)

O(k)

删除切片

O(n)

O(n)

更改切片

O(k+n)

O(k+n)

extend[注1]

O(k)

O(k)

O(n log n)

O(n log n)

列表乘法

O(nk)

O(nk)

x in s

O(n)

min(s), max(s)

O(n)

计算长度

O(1)

O(1)

双向队列(collections.deque)

deque (double-ended queue,双向队列)是以双向链表的形式实现的 (Well, a list of arrays rather than objects, for greater efficiency)。双向队列的两端都是可达的,但从查找队列中间的元素较为缓慢,增删元素就更慢了。

操作

平均情况

最坏情况

复制

O(n)

O(n)

append

O(1)

O(1)

appendleft

O(1)

O(1)

pop

O(1)

O(1)

popleft

O(1)

O(1)

extend

O(k)

O(k)

extendleft

O(k)

O(k)

rotate

O(k)

O(k)

remove

O(n)

O(n)

集合(set)

未列出的操作可参考 dict —— 二者的实现非常相似。

操作

平均情况

最坏情况

x in s

O(1)

O(n)

并集 s|t

O(len(s)+len(t))

交集 s&t

O(min(len(s), len(t))

O(len(s) * len(t))

差集 s-t

O(len(s))

s.difference_update(t)

O(len(t))

对称差集 s^t

O(len(s))

O(len(s) * len(t))

s.symmetric_difference_update(t)

O(len(t))

O(len(t) * len(s))

由源码得知,求差集(s-t,或s.difference(t))运算与更新为差集(s.difference_uptate(t))运算的时间复杂度并不相同!前者是将在s中,但不在t中的元素添加到新的集合中,因此时间复杂度为O(len(s));后者是将在t中的元素从s中移除,因此时间复杂度为O(len(t))。因此,使用时请留心,根据两个集合的大小以及是否需要新集合来选择合适的方法。

集合的s-t运算中,并不要求t也一定是集合。只要t是可遍历的对象即可。

字典(dict)

下列字典的平均情况基于以下假设:

1. 对象的散列函数足够撸棒(robust),不会发生冲突。

2. 字典的键是从所有可能的键的集合中随机选择的。

小窍门:只使用字符串作为字典的键。这么做虽然不会影响算法的时间复杂度,但会对常数项产生显著的影响,这决定了你的一段程序能多快跑完。

操作

平均情况

最坏情况

复制[注2]

O(n)

O(n)

取元素

O(1)

O(n)

更改元素[注1]

O(1)

O(n)

删除元素

O(1)

O(n)

遍历[注2]

O(n)

O(n)

注:

[1] = These operations rely on the “Amortized” part of “Amortized Worst Case”. Individual actions may take surprisingly long, depending on the history of the container.

[2] = For these operations, the worst case n is the maximum size the container ever achieved, rather than just the current size. For example, if N objects are added to a dictionary, then N-1 are deleted, the dictionary will still be sized for N objects (at least) until another insertion is made.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux中的码字软件,码字写作软件下载

极音创作linux版一款的掌上码字软件,这款软件支持ios,mac,Windows和Android设备上自动同步文件,有需要的朋友快来下载吧!软件特色1、【文件功能】在本软件的左侧是导航栏,罗列了几个常用的功能。在导航条上…

linux svn可视化工具,CentOS6.5安装SVN 可视化管理工具iF.SVNAdmin

实际系统环境:CentOS 6.5 x64一、安装Apache通常系统都已经装好了,但我的服务器上却没有安装,所以要安装:# yum install httpd二、安装SVN根据SVN官网指南使用yum进行安装:# yum install subversion mod_dav_svn三、配…

skywalking使用方法_SkyWalking 源码分析—— Collector Server Component 服务器组件

摘要: 原创出处 http://www.iocoder.cn/SkyWalking/collector-server-component/「芋道源码」欢迎转载,保留摘要,谢谢!本文主要基于 SkyWalking 3.2.6 正式版1. 概述2. 接口2.1 Server2.2 ServerHandler3. gRPC 实现3.1 GRPCServer3.2 GRPCHa…

linux dns及时添加,在ARM Linux上成功实现添加DNS库

工作需要要在嵌入Linux上实现DNS, 从Delphi的Indy9中移植了一个DNS,用了半年了还可以。今日偶然看到了网上有源码(竟然原来没有搜到ftp://ftp.isc.org/isc/bind9/9.5.0/bind-9.5.0.tar.gz)1. 找到bind-9.5.0.tar.gz源码,其中有包含DNS协议的源…

扫地机器人返充原理_扫地机器人全解析

文章引用自 薛先生 ,版权完全归属薛先生。其公众号:Alphatree and Evelyn2018-12-12思考出发点:那个多数人印象中乱碰乱撞、还拖着脏污满屋跑的添乱扫地机,还需要多久才能变聪明?扫地机器人的本质到底是什么? 该用家电…

wxpython多线程 假死_wxpython中利用线程防止假死的实现方法

前段时间我编写了一个工业控制的软件,在使用中一直存在一个问题,就是当软件检索设备时,因为这个功能执行的时间比较长,导致GUI界面假死,让用户分辨不清楚软件到底仍在执行,还是真的挂掉了。(虽然我设计了同…

linux dns 内网ip,Ubuntu中ip地址、网关、网络号、DNS等解释

在Ubuntu中查看ip地址,输入指令:ifconfig在Ubuntu中查看网关,DNS服务器的命令:nm-tool其中,inet 地址即为ip地址。在图中,我们看到有广播地址,还有掩码,当然在一个计算机网络中&…

10分钟用python编写贪吃蛇小游戏_牛得一批!10分钟用Python编写一个贪吃蛇小游戏...

贪吃蛇,大家应该都玩过。当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎。今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果:好了,先介绍一个思路所有的游戏最主…

linux 进程函数替换,Linux使用exec函数实现进程替换的代码分享

这篇文章主要介绍了Linux 进程替换(exec函数)实现代码的相关资料,需要的朋友可以参考下Linux 进程替换(exec函数)实现代码# include#include#include#include#include#include#includeint main(){pid_t idfork();if(id0){printf("child is running\n");sleep(1);char…

ad怎么批量改元器件封装_AD6.8的原理图中如何批量修改封装?

AD6.8的原理图中如何批量修改封装呀?一直未用这个功能,99SE中全局参数很好用,不过在AD6做修改的却只有当前选中的一个有效.相同属性的不作修改....是不是在别的地方有设置呀?高手指教...protel dxp 中将原件的对象整体编辑在工作区选择要改的原件 右击鼠标 选择fi…

cnn程序流程图_C# VISIO 画流程图

还是没有做PPT的灵感,总结下前段时间做的VISIO好了。网上VISIO的资料那个少啊,姐艰辛地做了一个星期啊一个星期,中间还夹杂着PMP道德题的高强度训练,和各种“不知道为啥那么难,为啥怎么做准确率都不高,难道…

Linux下netstat常用,Linux netstat常用命令

1、统计80端口连接数netstat -nat|grep -i "80"|wc -l2、统计httpd协议连接数(查看Apache的并发请求数及其TCP连接状态)ps -ef|grep httpd|wc -l3、统计已连接上的,状态为“establishednetstat -na|grep ESTABLISHED|wc -l4、查出哪个IP地址连接最多,将其…

word把选择答案弄到题目里_老师们看过来,如何快速整理试题答案

Word--如何批量把答案ABCD放到对应题目的后面(括号里或横线上)一般试题和答案是分开的,试题在前面,答案在后面,或者试题和答案分开在不同的文档,这是为方便出试卷测验。但是为了老师讲解的方便,又需要把试题和答案合起…

linux grub rescue 光盘,Ubuntu9.10用安装光盘如何进入linux rescue方式?

请详细说明你用winxp格式化之前的分区状态,和格式化后的分区状态。从出错信息来看,我初步认定你的linux引导分区(boot分区)全部丢失,只剩下mbr中的grub。如果确实是这样,你只能重装linux了。分两种情况。第一,你只要xp…

kernal tch 下载 天正_tch kernal.arx

tch_kernal.arx专门用来处理cad打不开图形的问题,很多友友说CAD图纸显示不全,在此来说说如何解决此类问题。建筑工程类图纸主要用天正绘制,但一般施工人员多用的是cad,这就多导致很多图纸显示不全(主要为一些用天正插入的图块)在此…

linux在线更新curl,Linux:curl

curl命令用来做HTTP协议的客户端,可以通过命令参数生成各种请求,非常强大。1. GET默认情况下下curl执行的是GET操作,所以可以当做wget使用如$ curl https://www.baidu.com现在百度使用了https协议,但是这个结果还是有点奇怪的&…

matlab数值拟合r2_MATLAB之数据处理+公式拟合

MATLAB之数据处理公式拟合前言:由试验得到一组数据,对该组数据进行处理,作图分析,分析各变量的关系,期望得到拟合公式。试验数据背景本次试验有三个自变量:V、M、G,因变量为F,每组试验重复5次&a…

c++输出重定向 linux,C++ stderr/stdout 重定向到文件

通常,stderr和stdout被用来输出内容显示到屏幕,但是,有时候我们需要把这些信息写到指定的文件,方便随时查阅。最简单的实现方式就是,把 stderr/stdout 的输出重定向到文件。stderr/stdout 重定向到文件这里以stderr代码…

docker run 挂载卷_docker mysql配置挂载到卷

docker--将mysql配置挂载到卷1、首先在根目录创建两个文件夹,其中config文件夹中创建my.cnf配置文件。data文件夹存放数据文件,一定要为空。/docker/mysql/config/、/docker/mysql/data2、修改my.cnf文件[mysqld]usermysql 一定要以这两行开头。更多的配…

c语言代码含义大全,小白求解代码各部分意思

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼using namespace std;typedef struct {int x;int y;}Point;//表示一迷宫坐标void FindWay(int *path,int n,int m,Point start,Point end) {while(start.x!end.x || start.y!end.y) {cout<switch(path[start.x*(m1)start.y]) {c…