演算法導論第十七章 攤還分析

2021-10-05 04:08:28 字數 1637 閱讀 2656

一.什麼是攤還分析?

1.它是一種分析演算法的方法,在攤還分析中,我們求資料結構的乙個操作序列中所執行的所有操作的平均時間來評價操作的代價。

2.這樣我們就可以說明乙個操作的平均代價是很低的(即使在某個單一操作的代價很高)。

3.但攤還分析卻不同於平均情況分析,它不涉及概率。但可以保證最壞情況下每個操作的平均效能。

一.聚合分析

利用聚合分析,我們證明對所有n,乙個n個操作的序列最壞情況下花費的時間為t(n),因此,在最壞情況下的每個操作的攤還代價(平均代價)為t(n)/n.

下面用棧操作來詳細分析:

1.push(s,x):將物件x壓入棧s中

2.pop(s):將棧s的棧頂物件彈出,並返回該物件。

我們都知道上面兩個操作的時間都是o(1),我們假定其代價均為1,那麼n個push或pop操作的總代價為n,其時間則為o(n),其平均執行時間為o(1)

現在我們增加一種方法:

3.multipop(s,k):此方法刪除棧s棧頂的k個物件。

我們假設刪除乙個物件的代價為1

則我們有:

當k=1時,只刪除棧頂第乙個元素,代價為1

當k=2時,刪除棧頂前兩個元素,代價為2

當k=3時,代價為3

當k=n時,我們有代價為n

所以:此操作的最壞單個操作代價為n

因此,任意乙個棧操作的最壞情況時間為o(n),從而乙個n個操作序列的最壞情況代價為o(n^2).

所以對任意乙個n值,任意操作花費的時間最多為o(n). 對其中乙個操作的平均時間為o(n)/n=o(1).

因此上面三種棧操作的平均代價都為o(1).

我們實際上得出的是乙個n個操作的序列最壞情況的執行代價為n,再除以n得到了每個操作的平均代價

二.核算法

核算法中有兩個概念:攤還代價和實際代價

攤還代價:用核算法進行攤還分析時,我們對不同的操作賦予的不同的代價,這些代價可能小於或大於其實際代價。

實際代價:操作實際執行時的代價。

信用:當乙個操作的攤還代價超出其實際代價時,我們將差額存入資料結構的特定的物件,存入的差額稱為信用

信用用來解決後續操作中攤還代價小於實際代價的時候,信用可以用來支付差額。

在核算法中,不同的的操作可能有不同的攤還代價,這種方法不同於聚合分析中所有操作都賦予相同攤還代價的方式。

下面用棧操作進行分析:

操作實際代價

push

1pop

1multipop(s,k)

min(k,s)

下面我們為這些操作賦予如下攤還代價:

操作攤還代價

push

2pop

0multipop(s,k)

0在上表中push的代價多1,它將分配給pop,由於每個棧中的每個元素都有伴隨著1個pop代價,所以對於n個multipop操作,其代價為n。

所以其總攤還代價為n,實際代價也是。

演算法導論第17章 攤還分析

在攤還分析中,我們求資料結構的乙個操作序列中所執行的所有操作的平均時間,來評價操作的代價,從而說明乙個操作的平均代價是很低的,即使序列中某一單一操作的代價很高,不涉及改了,但可以保證最壞情況下每個操作的平均時間。攤還分析中主要的三種方法 1 聚合分析 2 核算法 即記賬法 3 勢能法 1 聚合分析 ...

第十七章 Size Classes

通常,您希望應用程式的介面根據螢幕的尺寸和方向而顯示不同的布局。在本章中,您將修改homepwner中的detailviewcontroller的介面,以便當它出現在具有相對較小高度的螢幕上時,文字字段集合和影象檢視併排而不是堆疊在一起 圖17.1 圖17.1 homepwner 的 detailv...

第十七章 部署

總的來說,部署遇到了許多坑,而且還有好多坑還沒有踩。去cocode找了許多教程,才踩了一些坑,但是關於資料庫的坑,先留著。所有的db.session.add 後面都加上db.session.commit 才行。記得,這是狗書的問題!部署教程 每次修改後需要一下命令重新部署下 git add git ...