相信各位對語句 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