【算法簡介】平攤分析
1. 簡述
平攤分析是指在某種數據結構上完成一系列操作,在最壞情況下所需的平均時間。
平攤分析與傳統分析方法的主要差別為:
1)平攤分析時間與傳統分析方法的平均情況下時間不同,它是最壞情況下的平均時間。
2)平攤分析不涉及概率分析。
3)平攤分析中時間函數T(n),其中n指的是操作的次數,而不是輸入的規模。
常見的有三種方法:聚集法、記賬法、勢能法。
2. 合計法(聚集法)
2.1 合計法的思想:把n個不同或相同的操作合在一起加以分析計算得到總時間的方法。即n個操作序列在最壞情況下的總時間,記為T(n),其中n為操作數。由此得到在最壞情況下每個操作的平均時間為T(n)/n。
2.2 例子說明:棧操作的平攤分析(不同類操作)
操作 | 代價 |
---|---|
PUSH | 1 |
POP | 1 |
MULTIPOP | min(k,s) |
解法一,傳統方法分析:
由於三個操作最壞的操作為multipop操作,而一次multipop操作在最壞情況下的時間為O(n),如果n個操作均為multipop操作,則總時間將達到O(n^2)。
在最壞情況下n個操作的總時間T(n)= O(n^2),每個操作的平攤時間為:T(n)/n=O(n)。
解法二,合計法分析:
由於三個操作不是相互獨立的,一個對象入棧后最多彈出一次,因而在非空棧S上完成的pop次數(包括multipop操作)最多為push的次數,又由於初始棧S為空,且n個操作中push的次數≤n,pop次數≤n,由於每個push和pop操作的實際代價為O(1),所以n次操作在最壞情況下的總時間≤2n=O(n),每個操作的平攤時間為T(n)/n=O(1)。
2 記賬法
記帳法思想:先對每個不同的操作核定一個不同的費用(時間),然后計算n次操作總的費用。當然,由於這個費用是人為賦予的,所以很容易得到一個松上界。
這種事先的操作費用核定可能與實際費用不符,存在二種情況:
1)超額收費:核定費用>實際費用,此時差額存放在該對象的身上。
2)收費不足:核定費用<實際費用,此時差額由該對象身上的存款支付。
費用的核定(平攤核定)是否正確需檢查n次操作核定總費用是否大於n次操作實際總費用(這里n具有任意性,並不是單指一個定值n)。因此,在記賬方法中,某些操作的費用比它們實際代價或多或少。但push、pop、multipop操作的平攤時間為O(1)。
3 勢能法
思想:通過定義一個勢函數完成對每個操作的平攤核定。
勢是與整個數據結構聯系而不是其中的個別對象發生聯系的。且push、pop、multipop操作的平攤時間為O(1)。