資料結構 演算法基礎 複雜度分析2

2021-10-03 11:01:38 字數 1242 閱讀 2636

最好、最壞;平均;均攤時間複雜度

最好、最壞時間複雜度

**示例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 即常數階,乙個演算法中沒...