今天被一個很簡單的坑到了,還想了很長時間,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操作其實也是一種遍歷操作,需要花費的時間不是常量級,而是線性級