演算法設計 分析篇(攤銷分析)

2022-03-23 04:38:18 字數 2650 閱讀 6263

攤銷分析

攤銷是一種,功過相抵的思想:

①中國古代,某大臣因為犯錯,看在立下汗馬功勞的份上,從輕發落。

②圖靈被發現時個同性戀者,但因破解了德國海軍密碼,抵消罪過。

攤銷分析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的可能值為...