第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Python 中追加而不是 O(1)

在 Python 中追加而不是 O(1)

侃侃爾雅 2024-01-15 21:17:13
我正在嘗試監(jiān)控 Python 列表中的復(fù)雜性。因此,我編寫了上面的腳本,認(rèn)為在末尾插入一個(gè)項(xiàng)目的復(fù)雜度為 O(1),在開頭插入的復(fù)雜度為 O(n),如下所示import timefor p in [3,4,5,6,7]:    n = 10**p    print("n =", n, ":")        # Creation of a list [0, 1, ..., n]    li = list(range(n))        start = time.perf_counter()    # Adding item at the end    li.append('a')    stop = time.perf_counter()    duration = round((stop - start)*1000, 3)        print("Time for insertion at the end :", duration, "ms")        start = time.perf_counter()    # Adding item at the beginning    li.insert(0,'a')    stop = time.perf_counter()    duration = round((stop - start)*1000, 3)    print("Time for insertion at the beginning :", duration, "ms")    print()結(jié)果是:n = 1000 :Time for insertion at the end : 0.001 msTime for insertion at the beginning : 0.001 msn = 10000 :Time for insertion at the end : 0.003 msTime for insertion at the beginning : 0.007 msn = 100000 :Time for insertion at the end : 0.036 msTime for insertion at the beginning : 0.098 msn = 1000000 :Time for insertion at the end : 0.05 msTime for insertion at the beginning : 1.001 msn = 10000000 :Time for insertion at the end : 0.257 msTime for insertion at the beginning : 11.453 ms因此,開頭的插入顯然是 O(n),但末尾的插入顯然不是 O(1)。有人可以向我解釋一下嗎?配置:Ubuntu 20.04.1 LTS 上的 Python 3.8.5因此,我嘗試使用 timeit (按照建議),結(jié)果是應(yīng)有的結(jié)果。
查看完整描述

1 回答

?
尚方寶劍之說

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊

Python 中列表的大小是動(dòng)態(tài)的。但由于動(dòng)態(tài)列表的工作方式,并非所有追加都具有相同的成本。

最初為列表分配固定空間。當(dāng)分配的空間已滿并且我們想要追加一個(gè)元素時(shí),會(huì)為列表分配一個(gè)兩倍于先前空間的新空間,并將所有列表項(xiàng)復(fù)制到新位置。因此,如果分配的空間未滿,則追加需要 O(1),但如果分配的空間已滿,則需要 O(n)(因?yàn)槲覀冃枰葟?fù)制)。


追加 n 個(gè)項(xiàng)目的成本(假設(shè)最初分配了兩個(gè)單位的空間):


  (1) + (1)    # costs of appending the first two items

+ (2+1) + (1)  # costs of appending the next two items

+ (4+1) + (1) + (1) + (1)  # costs of appending the next four items

+ (8+1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) # costs of appending the next eight items

+ (16+1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1) + (1)

+ (32+1) + ...

...

這2 + 4 + 8 + 16 + ... + n大約等于 2n。所以nappend次操作總共花費(fèi)了2n。所以平均每項(xiàng)費(fèi)用O(1)。這稱為攤余成本。


查看完整回答
反對(duì) 回復(fù) 2024-01-15
  • 1 回答
  • 0 關(guān)注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)