第十二章 Amortized Analysis平攤分析
阿新 • • 發佈:2022-12-04
第12章 Amortized Analysis平攤分析
第10周
記於2022/11/29
概率分析與平攤分析的區別
- 概率分析
- 平均執行時間
- 考慮同一演算法的所有可能輸入情況
- 如果使用概率,則稱為期望執行時間
- 針對單一操作/演算法
- 平均執行時間
- 平攤分析
- 針對某一資料結構的 操作序列
- 不使用概率
- 操作序列中的平均操作效能/代價【主要針對物件】
- 操作代價可能不同,其中有些代價巨大
平攤分析策略
聚集分析
-
n個操作的序列最壞情況下花費總時間為T(n)
-
T(n) / n每個操作的平均代價(或攤還代價)
- - A[0]位每次都會進行反轉,總共進行n次 - A[1]位每間隔一次進行反轉,共計n/2向下取整 .... - A[i]位,n/(2^i)
-
對於n個累加的序列,最壞情況執行時間為O(n),因此每一個操作的平攤成本/【平均成本】為O(1)
記賬方法 / 核算法
【為不同的操作分配不同的費用 ,費用的金額稱為**平攤成本**】
每個操作賦予一個(不同的)平攤代價
-
平攤代價高於其實際代價 / 平攤成本大於實際成本
差值稱為某一操作的存款(credit),如果存款不足則無法進行該操作
存款用於補償以後那些平攤代價低於實際代價的操作
- 假設用 ci 表示第i個操作的實際成本/真實代價,用 ci` 表示其平攤成本/攤還代價
- 滿足:
- 適用於所有的操作序列,因此要求總的平攤成本作為總的實際成本的上限,總的平攤成本 - 總的實際成本>=0
- 在中間任意時刻,都要保持總的平攤成本 - 總的實際成本>=0
- - PUSH 的**攤還代價**為 2 ,是因為其中有一個1給PUSH操作,還有一個1是因為現在壓入一個數據將來要出棧,需要預留一個POP操作的成本 - 每個操作的平攤成本為O(1) - 對於二進位制計數器,如果用1¥代表每次操作的成本,flip of one bit就代表花1¥,那麼如果某位由0變為1給出的平攤成本為多少? **2¥,1¥用於支付現在由0->1的費用(實際成本),1¥存起來用於支付將來由1->0的費用** - 每次操作最多置 1 bit,因此一個操作的平攤成本最多為2¥ - 因此,n次操作總的平攤成本為O(n),平均每次的成本為O(1)
勢能方法
-
類似記賬方法
-
存款不是某一操作的,而是整個資料結構的勢(Potential);預付的不是存款,而是一種“勢能”,將勢能釋放即可以用來支付未來操作的代價
- - 總的平攤成本=總的實際成本 + 勢能的總變化
-
棧操作
- 勢能等於棧中元素的個數
-
二進位制計數器
- 勢能應該為某次操作後計數器中 1 的個數! 因為0的個數隻影響當前這一位,這一位完全可以用現在已有的勢能來支付其開銷
- 如果bi>0(中間計數狀態),bi等於原來的1的個數,減去重置個數,再加一個新set為1的個數
- 實際成本ci為ti+1,平攤成本<=2
動態表
-
操作:表插入、表刪除
-
應用場景
- 雜湊表
- 事先不知道表的大小;隨插入而擴充套件;隨刪除而收縮
-
目標
- 得到O(1)的平攤成本
- 未使用的空間 <= 已經使用的空間
-
負載係數α = num/size
- 如果size=0,則num=0,α=1
- 不允許α>1 (目標2)
-
表空間滿了則size加倍,保證α >= 1/2
-
Insert
-
聚集分析
- 記賬方法:插入x 收費3¥ :1¥-> x實際插入費用 1¥ -> 將來刪除x的費用 1¥ -> 其他專案【移動的費用】
-
勢能方法:
-
聚集分析
-
Expansion
-
Strategy