程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python:i for i in range(n)的時間復雜度|冷知識

編輯:Python

相信各位對語句 for i in range(n) 的時間復雜度都很清楚 就是O(n)的,但他如果換了個形式 你還認識嗎?比如說:

lst = [0 for i in range(10)]

哎你可能會說 這不就是創建一個長度為10的全0列表嘛 那時間復雜度就應該是O(1)的吧

害 那你跟我一樣一直都在犯錯誤啦 其實他是O(n)的

一般來說 以下兩條語句的執行效果應該是完全相同的:

lst = [0 for i in range(10)]

lst = [0]*(10)

都是創建一個長度為10的全0列表,但實際上第一種創建方式是O(n)的時間復雜度,而第二種才是O(1)的。這是為什麼呢,原因是內在邏輯的不同。

第一種方式其實是遍歷了一遍0-9的位置並給他們賦值為1,而第二種方式是直接將一個列表初始化為全1的列表。

為什麼稱之為冷知識呢,因為一般做算法題的時候,時間復雜度是由最高次項決定,絕大多數情況下,這兩種的列表創建方式不會對時間復雜度產生影響,所以一般就隨手寫一個了。但我今天遇到了個題終於讓我搞明白了這個知識點。

代碼如下: 

N = 10 ; M = 10 ; K = 10
for i in range(N) :
lst = [0 for i in range(K)]
for j in range(M) :
print(1)
N = 10 ; M = 10 ; K = 10
for i in range(N) :
lst = [0]*K
for j in range(M) :
print(1)

在其他部分代碼完全一樣的情況下 第一段代碼TLE了 而第二段代碼AC了

後來才明白 原來第一種情況的時間復雜度是 N*(K+M) 而第二種是N*M

所以希望大家以後在初始化一個全為某個數 (如0,1,2...) 的列表時, 都采用上述的第二種情況來創建,避免踩坑啦!!!


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved