fbpx
维基百科

平摊分析

平攤分析计算机科学中,是用於算法分析中的方法,平攤分析常用於分析資料結構(動態的資料結構),在使用平攤分析前須知道資料結構各種操作所可能發生的時間,並計算出最壞情况下的操作情況並加以平均,得到操作的平均耗费时間。平摊分析只能確保最坏情况性能的每次操作耗费的平均时间,並不能確認平均情况性能。

一個簡單的例子,一個長度為n的list,在list的最後要加入一筆新的資料此時要花費的操作時間為O(n),此時也是加入新的資料的最糟糕的情況。但是,一个 n 个插入的操作序列仍然可以在 O(n) 的时间内完成,因为剩下的插入可以在常数时间内完成,因此n 个插入可以在 O(n) 的时间内完成。因此每操作的平摊耗费为O(n) / n = O(1)。

注意平摊分析与平均时间分析和概率算法的概率分析不同。在平均时间分析中,我们平均化所有可能的输入;在概率算法的概率分析中,我们平均化所有可能的随机选择;在平摊分析中,我们平均化一系列操作的耗费。平摊分析假设的是最坏情况输入并且通常不运行随机选择。[1]

平摊分析中几种常用的技术:

  • 聚合分析决定 n 个操作序列的耗费上界T(n),然后计算平均耗费为 T(n) / n[1]
  • 记账方法确定每个操作的耗费,结合它的直接执行时间及它在对运行时中未来操作的影响。通常来说,许多短操作增量累加成「债」,而通过减少长操作的次数来「偿还」。[1]
  • 势能方法类似记账方法,但通过预先储蓄「势能」而在需要的时候释放。[1]

平攤分析種類

聚集法(Aggregate method)

計算n個操作的時間複雜度上限T(n) 平攤T(n)至每一個操作,每一個操作的平攤成本是T(n)/n

記帳法(Accounting method)

執行花費較低的operations時先存credit未雨綢繆, 供未來花費較高的operations使用

對每個操作定義一個合法的平攤成本(amortized cost) 假設 為第i個操作的actual cost, 為第i個操作的amortized cost

 ,則credit= ,我們把credit存起來(deposited),未來可以提取(withdraw) 若 ,則提取credit

設定每個操作的平攤成本(amortized cost)後,要做valid check確保credit不可以是0,也就是說  

位能法(Potential method)

定義一個位能函數(potential function) ,將資料結構D(例如: 堆疊)的狀態對應到一個實數

 : 資料結構D的初始狀態
 : 資料結構D經過 個操作後的狀態
 : 第 個操作的actual cost
 : 第 個操作的amortized cost

定義 

 

為了滿足 

我們定義  , 通常令  

例子

堆疊(stack)的平攤分析

我們定義一個堆疊有下列操作

操作(operation) 說明 actual cost
S.push(x) 將一個元素x放入堆疊S中  
S.pop() 把堆疊S中最上面的元素取出  
S.multi-pop(k) 一次pop k個元素  

S.mult-pop(k)的程式碼如下

def multi_pop(k): while (not S.empty()) and (k>0): S.pop() k -= 1 

接下來我們分別使用聚集法(aggregate method), 記帳法(Accounting method), 位能法(Potential method)求出"堆疊一個操作的平攤成本是O(1)"

使用聚集法(aggregate method)分析堆疊操作的平攤成本

 是S.push(x)的執行次數, 是S.pop()的執行次數, 是S.multi-pop(k)的執行次數

 為總執行次數
操作(operation) actual cost 執行次數
S.push(x)    
S.pop()    
S.multi-pop(k)    

因為一個堆疊S如果是空的,就不能執行pop了,也就是說可以pop或multi-pop的元素個數不會超過S中push進去的元素個數

所以 

假設 是執行 個操作的時間複雜度上限

 

所以堆疊一個操作的平攤成本為 

使用記帳法(Accouting method)分析堆疊操作的平攤成本

我們假設S.push(x), S.pop(), S.multi-pop(k)的amortized cost分別為2, 0, 0,如下表所示

操作(operation) actual cost   amortized cost  
S.push(x) 1 2
S.pop() 1 0
S.multi-pop(k)   0
Valid Check
證明:  
 
push進入堆疊S的元素會存入credit $1
pop(S), multi-pop(S, k) 會取出這些元素的credit $1

因此每個操作的平攤成本是O(1)


使用位能法(potential method)分析堆疊操作的平攤成本

我們定義位能函數 為執行i個操作後,堆疊內的元素個數

  ,因為堆疊一開始是空的
  ,因為堆疊的元素個數一定 

計算堆疊S每一個操作的平攤成本

操作(operation) 平攤成本(amortized cost)  
S.push(x)  
S.pop()  
S.multi-pop(k)  

總平攤成本  ,所以堆疊單一個操作的平攤成本是 

动态数组

 
动态数组的平摊分析

考虑一个随元素个数增加而增长的动态数组,比如JavaArrayList或者C++std::vector。如果我们的数组大小从4开始,那么来向其中增加四个元素的时间就是一个常数。然而,若要将第五个元素加入其中,那么会花费更多时间,因为我们此时必须要创建一个两倍于当前数组大小的数组(8个元素),把老元素拷贝到新数组中,然后增加一个新元素。接下来的三次加入操作也同样会花费常数时间,然后在数组被填满后则又需要一轮新的加倍扩充。

一般地,如果我们考虑任意一个任意的n大小的数组并对其进行n + 1次加入操作。我们注意到,所有的加入操作都是常数时间的,除了最后一个,它会花费 时间在大小加倍上。因为我们进行了n + 1次加入操作,我们可以将数组加倍的时间平摊到所有的加入操作上,因此得到加入操作的平均时间是 。它是一个常数。[1]

队列

使用Ruby實現的佇列,一个先進先出資料結構:

class Queue def initialize @input = [] @output = [] end def enqueue(element) @input << element end def dequeue if @output.empty? while @input.any? @output << @input.pop end end @output.pop end end 

佇列操作及特性參考佇列條目,enqeue及deqeue操作時間複雜度為常數, 否則,dequeue需要 時間將所有元素從輸入數組添加到輸出數組中,其中n是輸入數組的當前長度。 從輸入複製n元素後,我們可以在輸出數組再次為空之前執行n出隊操作,每次操作都需要一個恆定的時間。 因此,我們可以僅在 時間執行一系列n出列操作,這意味著每個出列操作的攤銷時間是 [2]

或者,我們可以收取將任何項目從輸入數組複製到輸出數組的成本,以及該項目的早期排隊操作。 該計費方案將入隊的攤還時間加倍,但將出列的攤還時間減少到 

通常用法

  • 在常见场合,我们把能很好平摊分析的算法称为“平摊算法”。
  • 在线算法通常使用平摊分析。

参考资料

[3]

  1. ^ 1.0 1.1 1.2 1.3 1.4 Kozen, Dexter. CS 3110 Lecture 20: Amortized Analysis. Cornell University. Spring 2011 [14 March 2015]. (原始内容于2018-10-03). 
  2. ^ Grossman, Dan. CSE332:Data Abstractions (PDF). cs.washington.edu. [2015年3月14日]. (原始内容 (PDF)于2015年4月2日). 
  3. ^ MIT 6.046J Design and Analysis of Algorithms, Spring 2015. MIT. [2018-10-21]. (原始内容于2018-11-25). 

平摊分析, 平攤分析在计算机科学中, 是用於算法分析中的方法, 平攤分析常用於分析資料結構, 動態的資料結構, 在使用平攤分析前須知道資料結構各種操作所可能發生的時間, 並計算出最壞情况下的操作情況並加以平均, 得到操作的平均耗费时間, 只能確保最坏情况性能的每次操作耗费的平均时间, 並不能確認平均情况性能, 一個簡單的例子, 一個長度為n的list, 在list的最後要加入一筆新的資料此時要花費的操作時間為o, 此時也是加入新的資料的最糟糕的情況, 但是, 一个, 个插入的操作序列仍然可以在, 的时间内完成, 因. 平攤分析在计算机科学中 是用於算法分析中的方法 平攤分析常用於分析資料結構 動態的資料結構 在使用平攤分析前須知道資料結構各種操作所可能發生的時間 並計算出最壞情况下的操作情況並加以平均 得到操作的平均耗费时間 平摊分析只能確保最坏情况性能的每次操作耗费的平均时间 並不能確認平均情况性能 一個簡單的例子 一個長度為n的list 在list的最後要加入一筆新的資料此時要花費的操作時間為O n 此時也是加入新的資料的最糟糕的情況 但是 一个 n 个插入的操作序列仍然可以在 O n 的时间内完成 因为剩下的插入可以在常数时间内完成 因此n 个插入可以在 O n 的时间内完成 因此每操作的平摊耗费为O n n O 1 注意平摊分析与平均时间分析和概率算法的概率分析不同 在平均时间分析中 我们平均化所有可能的输入 在概率算法的概率分析中 我们平均化所有可能的随机选择 在平摊分析中 我们平均化一系列操作的耗费 平摊分析假设的是最坏情况输入并且通常不运行随机选择 1 平摊分析中几种常用的技术 聚合分析决定 n 个操作序列的耗费上界T n 然后计算平均耗费为 T n n 1 记账方法确定每个操作的耗费 结合它的直接执行时间及它在对运行时中未来操作的影响 通常来说 许多短操作增量累加成 债 而通过减少长操作的次数来 偿还 1 势能方法类似记账方法 但通过预先储蓄 势能 而在需要的时候释放 1 目录 1 平攤分析種類 1 1 聚集法 Aggregate method 1 2 記帳法 Accounting method 1 3 位能法 Potential method 2 例子 2 1 堆疊 stack 的平攤分析 2 1 1 使用聚集法 aggregate method 分析堆疊操作的平攤成本 2 1 2 使用記帳法 Accouting method 分析堆疊操作的平攤成本 2 1 3 使用位能法 potential method 分析堆疊操作的平攤成本 2 2 动态数组 2 3 队列 3 通常用法 4 参考资料平攤分析種類 编辑聚集法 Aggregate method 编辑 計算n個操作的時間複雜度上限T n 平攤T n 至每一個操作 每一個操作的平攤成本是T n n 記帳法 Accounting method 编辑 執行花費較低的operations時先存credit未雨綢繆 供未來花費較高的operations使用對每個操作定義一個合法的平攤成本 amortized cost 假設c i displaystyle c i 為第i個操作的actual cost c i displaystyle hat c i 為第i個操作的amortized cost若c i lt c i displaystyle c i lt hat c i 則credit c i c i displaystyle hat c i c i 我們把credit存起來 deposited 未來可以提取 withdraw 若c i gt c i displaystyle c i gt hat c i 則提取credit設定每個操作的平攤成本 amortized cost 後 要做valid check確保credit不可以是0 也就是說 k 1 n c i k 1 n c i displaystyle sum k 1 n hat c i geq sum k 1 n c i 位能法 Potential method 编辑 定義一個位能函數 potential function F D displaystyle Phi D 將資料結構D 例如 堆疊 的狀態對應到一個實數 D 0 displaystyle D 0 資料結構D的初始狀態D i displaystyle D i 資料結構D經過i displaystyle i 個操作後的狀態c i displaystyle c i 第i displaystyle i 個操作的actual costc i displaystyle hat c i 第i displaystyle i 個操作的amortized cost定義c i c i F D i F D i 1 displaystyle hat c i c i Phi D i Phi D i 1 k 1 n c i k 1 n c i F D i F D i 1 k 1 n c i F D n F D 0 displaystyle sum k 1 n hat c i sum k 1 n c i Phi D i Phi D i 1 sum k 1 n c i Phi D n Phi D 0 為了滿足 k 1 n c i k 1 n c i displaystyle sum k 1 n hat c i geq sum k 1 n c i 我們定義F D n F D 0 0 displaystyle Phi D n Phi D 0 geq 0 通常令F D 0 0 displaystyle Phi D 0 0 和 F D n 0 displaystyle Phi D n geq 0 例子 编辑堆疊 stack 的平攤分析 编辑 我們定義一個堆疊有下列操作 操作 operation 說明 actual costS push x 將一個元素x放入堆疊S中 O 1 displaystyle O 1 S pop 把堆疊S中最上面的元素取出 O 1 displaystyle O 1 S multi pop k 一次pop k個元素 O min S k displaystyle O min left vert S right vert k S mult pop k 的程式碼如下 def multi pop k while not S empty and k gt 0 S pop k 1 接下來我們分別使用聚集法 aggregate method 記帳法 Accounting method 位能法 Potential method 求出 堆疊一個操作的平攤成本是O 1 使用聚集法 aggregate method 分析堆疊操作的平攤成本 编辑 令n p u s h displaystyle n push 是S push x 的執行次數 n p o p displaystyle n pop 是S pop 的執行次數 n m u l t i p o p displaystyle n multi pop 是S multi pop k 的執行次數 n n p u s h n p o p n m u l t i p o p displaystyle n n push n pop n multi pop 為總執行次數操作 operation actual cost 執行次數S push x O 1 displaystyle O 1 n p u s h displaystyle n push S pop O 1 displaystyle O 1 n p o p displaystyle n pop S multi pop k O min S k displaystyle O min left vert S right vert k n m u l t i p o p displaystyle n multi pop 因為一個堆疊S如果是空的 就不能執行pop了 也就是說可以pop或multi pop的元素個數不會超過S中push進去的元素個數所以n p o p n m u l t i p o p n p u s h displaystyle n pop n multi pop leq n push 假設T n displaystyle T n 是執行n displaystyle n 個操作的時間複雜度上限 T n O 1 n p u s h O 1 n p u s h O n displaystyle T n O 1 times n push O 1 times n push O n 所以堆疊一個操作的平攤成本為O n n O 1 displaystyle O n n O 1 使用記帳法 Accouting method 分析堆疊操作的平攤成本 编辑 我們假設S push x S pop S multi pop k 的amortized cost分別為2 0 0 如下表所示 操作 operation actual cost c i displaystyle c i amortized cost c i displaystyle hat c i S push x 1 2S pop 1 0S multi pop k O min S k displaystyle O min left vert S right vert k 0Valid Check 證明 k 1 n c i k 1 n c i displaystyle sum k 1 n hat c i geq sum k 1 n c i p r o o f displaystyle color Red proof push進入堆疊S的元素會存入credit 1 pop S multi pop S k 會取出這些元素的credit 1因此每個操作的平攤成本是O 1 使用位能法 potential method 分析堆疊操作的平攤成本 编辑 我們定義位能函數F D displaystyle Phi D 為執行i個操作後 堆疊內的元素個數 F D 0 0 displaystyle Phi D 0 0 因為堆疊一開始是空的F D i 0 displaystyle Phi D i geq 0 因為堆疊的元素個數一定 0 displaystyle geq 0 計算堆疊S每一個操作的平攤成本 操作 operation 平攤成本 amortized cost c i displaystyle hat c i S push x c i c i F D i F D i 1 1 S 1 S 2 displaystyle hat c i c i Phi D i Phi D i 1 1 left vert S right vert 1 left vert S right vert 2 S pop c i c i F D i F D i 1 1 S 1 S 0 displaystyle hat c i c i Phi D i Phi D i 1 1 left vert S 1 right vert left vert S right vert 0 S multi pop k c i c i F D i F D i 1 k S k S k k 0 displaystyle hat c i c i Phi D i Phi D i 1 k left vert S k right vert left vert S right vert k k 0 總平攤成本 k 1 n c i 2 n p u s h O n displaystyle sum k 1 n hat c i 2 times n push O n 所以堆疊單一個操作的平攤成本是O n n O 1 displaystyle O n n O 1 动态数组 编辑 动态数组的平摊分析 考虑一个随元素个数增加而增长的动态数组 比如Java的ArrayList或者C 的std vector 如果我们的数组大小从4开始 那么来向其中增加四个元素的时间就是一个常数 然而 若要将第五个元素加入其中 那么会花费更多时间 因为我们此时必须要创建一个两倍于当前数组大小的数组 8个元素 把老元素拷贝到新数组中 然后增加一个新元素 接下来的三次加入操作也同样会花费常数时间 然后在数组被填满后则又需要一轮新的加倍扩充 一般地 如果我们考虑任意一个任意的n大小的数组并对其进行n 1次加入操作 我们注意到 所有的加入操作都是常数时间的 除了最后一个 它会花费O n displaystyle O n 时间在大小加倍上 因为我们进行了n 1次加入操作 我们可以将数组加倍的时间平摊到所有的加入操作上 因此得到加入操作的平均时间是n O 1 O n n 1 O 1 displaystyle tfrac nO 1 O n n 1 O 1 它是一个常数 1 队列 编辑 使用Ruby實現的佇列 一个先進先出資料結構 class Queue def initialize input output end def enqueue element input lt lt element end def dequeue if output empty while input any output lt lt input pop end end output pop end end 佇列操作及特性參考佇列條目 enqeue及deqeue操作時間複雜度為常數 否則 dequeue需要O n displaystyle O n 時間將所有元素從輸入數組添加到輸出數組中 其中n是輸入數組的當前長度 從輸入複製n元素後 我們可以在輸出數組再次為空之前執行n出隊操作 每次操作都需要一個恆定的時間 因此 我們可以僅在o n displaystyle o n 時間執行一系列n出列操作 這意味著每個出列操作的攤銷時間是O 1 displaystyle O 1 2 或者 我們可以收取將任何項目從輸入數組複製到輸出數組的成本 以及該項目的早期排隊操作 該計費方案將入隊的攤還時間加倍 但將出列的攤還時間減少到O 1 displaystyle O 1 通常用法 编辑在常见场合 我们把能很好平摊分析的算法称为 平摊算法 在线算法通常使用平摊分析 参考资料 编辑 3 1 0 1 1 1 2 1 3 1 4 Kozen Dexter CS 3110 Lecture 20 Amortized Analysis Cornell University Spring 2011 14 March 2015 原始内容存档于2018 10 03 Grossman Dan CSE332 Data Abstractions PDF cs washington edu 2015年3月14日 原始内容存档 PDF 于2015年4月2日 MIT 6 046J Design and Analysis of Algorithms Spring 2015 MIT 2018 10 21 原始内容存档于2018 11 25 取自 https zh wikipedia org w index php title 平摊分析 amp oldid 70427177, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。