動態表的擴張與收縮

2021-08-19 03:50:50 字數 1040 閱讀 3669

應用

這部分內容是clrs為介紹平攤分析方法而引入的例子,在實際中也可以用與設計動態表,如stl中的vector模板。vector是個動態表,可以不斷插入和刪除元素仍然保持良好的複雜度。什麼時候擴張表,什麼時候收縮表很重要,決定了相關操作的執行時間。

擴張乙個動態表不會一直擴張,往往在是現有的表滿載的情況下,再次插入乙個元素才會導致表擴張。表擴張時,先申請乙個更大的新錶,然後把現有的表中的元素逐個複製進新表,再把這個元素插進去。

那麼申請多大的表合適呢?乙個自然的想法是申請乙個兩倍大小的新錶。

接著定義承載因子: α=

nums

ize

注,空表的α定義為1(0/0)。承載因子反映了表的負載情況,可以知道a總是大於等於0.5小於等於1。表滿載時,α = 1,接下來進行表拓張,a = 0.5。插入操作會使得α增大。

接下來分析對錶進行n個插入操作,t(n)是多少。

通過聚合分析可以知道,t(n) = o(n)。

通過記賬法,設第i(i是2的次冪)個操作的平攤時間是 i=

2k−1

+2k−

2∗1−

1 ,例如第8個插入的均攤時間為 1 + 1 + 1 + 8 ,前面為 5 - 7的實際代價,後面是把前面七個複製+再插入自己的代價。類似,第16個操作為 1 + 1 + 1 + 1 + 1 + 1 + 1 + 16。

就是勢能方法了。

勢能法分析表插入操作,通過公式計算,無論是否觸發表擴張,插入的均攤時間都是3,故t(n) = o(n)。每個插入都是線性的。

擴張和收縮

動態表擴張的下半部分考慮了n個操作中,包含插入和刪除操作。刪除會使得α變小,當α小到一定程度,會進行表的收縮操作。那麼這個程度是多少呢?自然地我們也按照上文的0.5來考慮。但是,這個界限是有隱患的。

假設採用α = 0.5這個界限來設計表收縮操作,那麼當表處於乙個臨界狀態,這時對錶進行插入操作,導致表拓張,α變回0.5。這時再對錶進行刪除,將導致表收縮。頻繁地進行這樣的操作,效能會惡化。

於是要採取另乙個界限,避免上述的情況。書中給出的例子是a = 1/4時,進行表的收縮。

離散數學 量詞轄域收縮與擴張的理解

設a x 是含x自由出現的公式,b中不含x的出現 上面四個等值式中,畢竟b不含x的出現,是比較好理解的,可以令b為1或0,討論a x 這四個式子,證明是容易證明的,可以利用蘊涵等值式進行轉化即可證明。問題是這四個式子中的第乙個和第三個式子有些難理解,這裡舉個例子便於理解。x代表人,a x x在中國,...

Oracle收縮臨時表空間與臨時檔案

資料庫在使用一段時間後,尤其是存在頻繁的imp exp操作以及排序操作時,臨時表空間就會越來越大,對應的資料檔案也會很大。從oracle 11g開始,可以使用shrink命令收縮臨時表空間和臨時檔案,也可以使用resize命令對資料檔案進行大小進行調整。一 shrink命令 oracle幫助文件 a...

ORACLE 收縮表空間的資料檔案

在實際的應用中經常會遇到truncate或者delete表中的資料後發現表空間並沒有將空間進行釋放,磁碟空間被告占用感覺空間白白被浪費掉了。提供乙個 表空間的簡單方法供參考 通過下面的sql語句檢視表空間總大小及實用大小,然後拼出來乙個sql語句將表空間的資料檔案重新設定大小 select alte...