1. 程式人生 > 其它 >第十二章 Amortized Analysis平攤分析

第十二章 Amortized Analysis平攤分析

第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