4.1外存存儲結構與外存算法:
分層存儲:
做法:
可擴展性問題:若程序分散地訪問磁盤上的數據,即使是好的操作系統也無法利用數據塊存取優勢
基本界限:
、
隊列和堆棧:
4.2外存算法示例:外存排序算法
算法的分析1:(多路歸並)
M/B路
以塊為單位進行調度
1.首先從磁盤里把磁盤塊放進內存,在內存中進行排序,每次放M/B塊,一共放N/B塊。做完后,外存中已經是在大小為M/B的區域里、分別排好序的數據。再分別取M/B-1個這些區域的第一個元素,放入內存中。
2.在內存中,將M/B-1塊用於磁盤塊的歸並,剩余的一塊用作緩存
do{
step1.[取出]M/B-1塊中最小的數據,放於緩存中
step2.(用於緩存的磁盤塊未滿,step1)||(緩存滿后,寫出到外存,清空緩存)||(前M/B-1個磁盤塊中的數據被取完,加載相應區域的下一個磁盤塊)
}while(將所有的磁盤塊中的數據都進行了排序)
疑問:如果step1中,排序磁盤塊的次數大於M/B-1,那么歸並排序時應該怎么做?
(演示的例子里,在內存中排序磁盤塊的次數=M/B-1=3)
循環停止條件:(k-1代表第k輪)
算法分析2:(快排)
根號(M/B)路
M=8,N=24,B=2
(8,16是選擇的分點,buffer磁盤塊的大小為B,buffer滿了以后,將里面的數據寫到外存)
此時,寫出到外存的三個區域的元素還沒進行排序,但是大小已經可以放進內存,接下來將數據放進內存進行排序。若大小仍不能放進內存,則繼續上述做法,直到數據塊的大小可以放進內存。
復雜度分析:
划分停止條件:
計算分割元素:
存在的問題:
解決方法:
改進的算法的步驟:
從而得到每一路歸並的元素上限。
算法復雜性分析:
其中,步驟二經過根號(M/B)次抽取分割元素,在4N/根號(M/B)的數據(第一次的抽樣的結果)內抽取
總結:
它們都是最優的。
4.3外存數據結構示例:外存查找樹
內存查找樹:
外存查找樹:
外部搜索樹:
存在的問題:使用紅黑樹維護BFS塊
5.1B樹:
B樹上的查詢:
為符合需求,B樹應該滿足的性質:
(a,b)樹:
“所有的葉子在同一層並且包括a到b個元素”:葉子節點的磁盤塊的數量為[a,b]
對(a,b)樹進行分析:
(a,b)樹中的操作:
插入:
刪除:
注:若最后合並影響了根節點,使根節點的兒子小於a,此時根節點是不變的(參考上文對根節點數量的定義)。然而,若根節點只有一個兒子,則把根節點給刪了
B樹的結論:
5.2KD樹
查詢:
kdB-樹:
kdB-樹的構建:
改進:
復雜度:
動態地改進:
插入:
刪除:
kdB-樹總結:
6.1 表排序及其應用
表排序(List Ranking)
表排序的困難之處:
一種高效的表排序算法:
分析:
目標:對給定的樹T,以表L表示,進而讓對T的每一種計算可用對L的一種rank來完成
歐拉回路技術:
應用場景:
1.父子關系判定:
2.計算前序計數:
3.計算子樹大小:
6.2時間前向處理方法:
將圖問題表示為有向無環圖的估值問題
處理過程:
......
測試:
求最大獨立集MIS(貪心法,不一定求得最優解):
(1的入度為0,在I中,選取后面的節點時,若其父親節點在I中,則該節點不能加入I中):
6.3縮圖法:
即把大的圖縮到內存中
求連通性->半外存算法:結點在內存中,邊在外存中
算法分析:
M(memory)
若|V|>M:
算法復雜度分析:
應用:最小生成樹
時間復雜度分析:
另一種圖算法技術: