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.pswp.cn/news/533519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533519.shtml
英文地址,請注明出處:http://en.pswp.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…