攤銷分析
攤銷是一種,功過相抵的思想:
①中國古代,某大臣因為犯錯,看在立下汗馬功勞的份上,從輕發落。
②圖靈被發現時個同性戀者,但因破解了德國海軍密碼,抵消罪過。
攤銷分析vs平均情況分析
以一場籃球比賽為例。
平均情況分析:比賽結束後乙個隊伍的得分就是所有隊員得分的總分,除以隊員數,就是每個隊員平均得分。
攤銷分析:針對的是最壞情況下的平均,既每個隊員表現的都是平時訓練時的最差水平
攤銷分析(最差情況下的平均)≠ 平均情況分析!
攤銷分析vs最壞時間複雜性分析
1.最壞時間複雜性分析:分析演算法的最壞時間複雜度。
2.攤銷分析:連續執行n次最壞情況分析可能沒有反應現實,因為特定的演算法和資料結構,最壞情況不一定連續發生。
攤銷分析(執行n次平均)≠ 最壞時間複雜性分析(單次)
攤銷分析的目的:
找出演算法進行一系列操作時,在最壞情況下乙個操作的平均成本,主要從演算法的執行步驟,演算法的資料結構兩個方面分析。
概率分析vs攤銷分析
概率分析:
1.考慮演算法平均執行時間
2.考慮演算法的所有可能輸入
3.可能涉及使用概率,稱為期望執行時間
攤銷分析:
1.執行步驟中的平均最壞情況下的效能
2.針對某乙個資料結構的操作
3.不涉及概率問題
攤銷分析的三種方法:
聚類法
先求出合計,然後求平均。求出n個操作的總代價上界t(n),每個操作的攤銷代價t(n)/n。
簡單
常用會計法
計算每個操作的攤銷成本,累加每個個體操作的攤銷成本,得到一組操作的總攤銷成本。
複雜勢能法
類似記賬,存款不是某一操作的,而是整個資料結構的勢。
可靠準確
方法一:聚類分析
棧操作的聚類分析,核心思想
對資料結構共有n個操作,最壞情況下:
操作1:t1
操作2:t2
操作3:t3
操作n:tn
t(n)=t1+t2+...+tn
攤銷代價t(n)/n
棧操作的聚類分析:
棧的主要特性為先進後出,主要操作有壓棧(push)和出棧(pop);
push(s,x):將x壓入棧s,時間成本o(1);
pop(s):將棧頂元素彈出,時間成本o(1);
multipop(s,k):將棧s中k個元素連續彈出,如果元素不到k個,則一直將棧談空為止,操作成本min(|s|,k);
提問:假如我們進行了一組壓棧,出棧的操作,一共n次,最壞情況下,n次操作的成本是多少?
聚類分析:
由於棧這種資料結構如果進行了n次push操作,則pop操作的次數不可能大於n次,所以最壞的情況是進行了n-1次push操作,最後一次執行multipop。
操作成本為2(n-1)次。一組n次push、multipop操作的總成本為o(n),分攤到n個操作上,每個操作的攤銷成本只有o(1);
注:因為不知到push、multipop各進行了多少次,無法單獨計算每個操作的成本,但可以計算出總成本的上限。適合使用聚類分析。
這種將一類操作聚集在一起進行總成本分析,然後平坦到每個操作上的思想,就是聚類分析。
二進位制計數器的聚類分析
所有時鐘計數器抽象層面上看成乙個二進位制計數器,乙個n位的二進位制計數器用陣列a[n-1]來表示,a[0]為最低有效位,a[n-1]為最高有效位。
從0開始往上計數,到2的n次方為止,計數過程中,不同字位可能發生變化,1變0,0變1,假定每次反轉成本為1。
如0111,加一之後為1000,翻轉了4位,則這次操作成本為4。
遞增函式實現如下:
increment(a)i=0;
while(i1
)if(i計數到2的n次方,總共遞增2的n次,在這n次遞增操作中,字位翻轉總數
n(1+1/2+1/4+1/8+...1/2^n)=2n
所以n次遞增操作的成本只用o(n),平坦之後,每次的操作成本為o(1)。
方法二:會計分析
聚類分析的特點是將所有操作看作乙個整體,計算總成本,用總成本除以運算元獲得攤銷成本。另一種方法就是,分別計算每個操作的成本,然後累加再平均,這就是會計分析。
會計分析和聚類分析之間有個顯著的不同:聚類分析的所有操作攤銷成本是一樣的,而會計分析裡不同操作可以有不同的攤銷成本。
以棧為例,當壓入乙個元素時,實際成本為1,但壓進去的總歸要彈出來,它必然還有個彈出的成本。現在我們將乙個操作現在和以後產生的成本總計下來,壓棧的攤銷成本為2。而後續pop和multipop的成本已經考慮過了,所以攤銷成本為0。
所以,對於乙個n個操作的序列,總攤銷成本最多為2n,因此總攤銷成本為o(n),單個操作的攤銷成本為o(1)。
方法三:勢能分析
會計分析中,將未來可能產生的成本記錄下來,稱為信用,存放在個體操作中。這並不是唯一方法,將信用存放在整個資料結構中供所有元素共享,存放在資料結構中的信用,可以看作一種潛在的支付能力,我們稱為勢能,這種分析方法被稱為勢能分析。
演算法分析與設計 分治演算法
在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法 快速排序,歸併排序 傅利葉變換 快速傅...
系統設計分析
系統設計出來的好壞很大程度取決於使用者需求是否合理,當然還有就是完成專案的技術上是否有難度。在公司我剛做完乙個專案,當然是乙個非常小的專案。雖然是乙個小專案,但它五臟俱全。還有就是寫的系統是為公司自己用。就算是這麼小的專案也經過了兩次大的需求的變動。由於需求分析不由我本人來做,我的角色是專案開發者。...
演算法設計分析 解剖回溯法
有這樣幾類問題 建立數學模型,在有限時間內,用解析的方法求解 建立數學模型,但在有限時間內,用數學解析的方法求解困難,只好用搜尋或模擬來求解,常見方法有 窮舉深度優先搜尋方法 廣度優先搜尋方法 啟發式演算法 窮舉,適用於 可預見確定解元素個數,且問題規模不是特別大 對於每個解變數a1,an的可能值為...