最好、最壞;平均;均攤時間複雜度
最好、最壞時間複雜度
**示例1
# **示例1
deffind
(x, list_)
:for item in list_:
if item == x:
pos = list_.index(x)
return pos
上述**時間複雜度:等於len(list_)=n => o(n)
# 改寫
deffind2
(x,list_)
:for item in list_:
if item == x:
return list_.index(x)
假如list_=[1,2,3,4,5,6,7],目標值:x=1;此時就能在o(1)的時間複雜度內找到該值;#最好
當x不存在這個列表中,需要對整個列表進行遍歷,此時o(n)#最壞
以上就是最好、最壞時間複雜度的例子;
平均時間複雜度
上述**中,list_長度為n,尋找list的值是否與目標值相等的情況:
1+2+3+……+n-1+n => n(n-1)/2; 值存在於list中的情況:n+1
t(n) = n(n-1)/(2(n+1))
通常,我們會忽略掉常數,係數;得到o(n)。
加權平均時間複雜度
上述x存在於list中的情況,是不可能會一樣的,假設,x存在與不存在的概率都是1/2,
存在與0~n-1,概率=1/n,總的概率 = 1/(2n);
平均時間複雜度變成:
1(1/(2n))+2(1/(2n))+3*(1/(2n))+4*(1/(2n))+……+n*(1/(2n))=n(n-1)/2 * 1/(2n) = n(n-1)/(4n)
得出結論:加權平均時間複雜度:o(n)
均攤(攤還)時間複雜度
在python內部,列表是動態的,因為他能夠實現動態擴容;列表建立的時候會預估你需要存的長度,當你要存的東西快要超出長度的時候,他會申請兩倍於自身的空間,進行擴容。
假設我們這個列表在存放滿了的時候才進行擴容;會出現以下兩種情況:
第二:列表剛好滿了,我還要再插值,先申請兩倍大的空間,將內容複製到新的空間,再插值;
時間複雜度:o(n)
攤還分析:當我們進行一次o(n)的操作,都會有n-1次的o(1)的操作;
動態插入的的均攤時間複雜度:o(1)。
資料結構 演算法基礎 複雜度分析
演示 def func a 1 b 2 c 3if name main func 時間複雜度?執行次數上述 他的複雜度 假設每次執行都花了 unit t 時間,上述 func 執行了3次,花費 3 unit t 的時間。演示2 演示2 deffunc2 n sum 0 unit t for i in...
資料結構與演算法基礎 複雜度分析基礎2
1 為什麼需要考量乙個演算法的複雜度?事後統計法 就我個人而言,演算法的好壞,可以考量我們應用效率,有些公司通過大量的測試去考量乙個演算法,通過測試監控執行的時間複雜度,空間等複雜度,這都必須經過通過資料測試來求得,這種結果相對來說還是比較準確的,畢竟是經過實踐測試得到,但是是這種測試依賴集群環境,...
1 1資料結構 演算法複雜度分析
1 演算法時間複雜度分析 1 原操作 定義語句 賦值語句 輸入輸出語句 即非迴圈 順序 分支等控制結構 2 頻度 tn 原操作執行的次數 4 演算法時間複雜度o n 頻度的數量級 5 問題規模n 把任何要解決的問題的輸入都轉化成乙個陣列,那麼陣列長度就是問題規模。6 o 1 即常數階,乙個演算法中沒...