Skyline查詢


 假設一個數據庫存儲每個酒店的以下信息:它的價格(夜間價格)、離海灘的距離。用戶希望檢索“最佳”酒店,如何比較兩個酒店的質量呢?

$a$ 比 $b$ 好嗎?是的,$a$ 酒店比 $b$ 酒店更便宜,而且離海灘更近,我們說 $a$ 支配 $b$。

$a$ 是不是比 $i$ 好呢?它們是不可比的。一些用戶可能更喜歡 $a$(因為它離海灘更近),而另一些用戶可能更喜歡 $i$(因為它更便宜)。

skyline 包含了所有不受其它酒店支配的酒店。skyline = $\left \{ a,i,k \right \}$,而非 skyline 酒店在大多數情況下不會被用戶考慮。

                        

skyline 查詢算法用到了兩個重要的性質:

   1)支配傳遞性:如果 $p_1$ 支配 $p_2$,$p_2$ 支配 $p_3$,那么我們就有 $p_1$ 支配 $p_3$。

   2)如果一個點不能支配另一個點,那么反之亦然。

 

1. Block Nested Loop (BNL) 

   這個是最基本的查詢算法,通過暴力搜索,判斷每個酒店是否有被其他酒店支配,平方時間復雜度。

 

2. Sort First Skyline (SFS)

   SFS是一種改進的BNL。首先根據(單調)偏好函數對整個數據集按某個維度進行排序。然后按 BNL 算法計算。

 

3. SCAN 掃描算法

   順序掃描表格,掃描過程中維護可能成為 skyline 點的列表,假設內存允許在 List 中最多保留 $3$ 個條目。

   首先初始化 List,即將 $a$ 加入 List —— List = $\left \{ a \right \}$,接下來順序掃描表格中的其它點,做如下兩個判斷:

       a. 當前掃描到的點是否被 List 內的點所支配,如果沒有被支配則執行步驟 $b$;否則將該點舍棄,然后掃描下一個點。

       b. 當前掃描到的點是否支配 List 內的點,如果是則刪除 List 內所有被當前點支配的點,然后執行步驟 $c$。

       c. 判斷 List 內的元素是否達到元素上限,如果沒有,則將該點加入 List,否則將該點寫入磁盤,並對當前 List 內的點做標記,只有第一次

          溢出時做標記,表示當前了 List 內的點和磁盤上的點互不支配。 

   以上面酒店為例,它的 SACN 掃描算法過程如下:

   1)因為 $a$ 支配 $b$,所以丟棄 $b$,被舍棄的點不會成為 skyline 點,如果 $b$ 會支配其它的點,那么這個點必然也被 $a$ 支配。

   2)因為 $c$ 不被 List 里面的點支配,也不支配 List 里的點,所以 $c$ 加入 List —— List = $\left \{ a,c \right \}$。

   4)因為 $d$ 不被 List 里面的點支配,也不支配 List 里的點,所以 $d$ 加入 List —— List = $\left \{ a,c,d \right \}$。

   5)因為 $a$ 支配 $e$,所以丟棄 $e$。

   6)$f$ 應該加入 List,但 List 已經滿了,所以將 $f$ 寫入磁盤文件,並標記所有當時在 List中的點 —— List = $\left \{ a^{'},c^{'},d^{'}\right \}$, File = $\left \{ f \right \}$。

   7)因為 $g$ 支配 List 里面的 $d$,所以用 $g$ 替換 $d$ ——  List = $\left \{ a^{'},c^{'},g \right \}$, File = $\left \{ f \right \}$,$g$ 是沒有標記的。

   8)因為 $h$ 支配 List 中的 $c,g$,所以用 $h$ 替換 $c,g$ ——  List = $\left \{ a^{'},h \right \}$, File = $\left \{ f \right \}$

       ....

   9)因為 $i$ 支配 $h$,所以用 $i$ 替換 $h$ —— List = $\left \{ a^{'},i \right \}$, File = $\left \{ f \right \}$

   10)List = $\left \{ a^{'},i,k \right \}$, File = $\left \{ f \right \}$

   11)$l,m,n$ 均被舍棄。

   12)List 中有標記的點就是 skyline 點,然后還要針對 file 再做一遍 SCAN。

   13)結果 $S = \left \{ a,i,k \right \}$。

 

4. Divide and Conquer (D&C)

   把點分成幾組,使得每組的數據都能夠放進內存。分別處理這些組,然后合並它們的結果。$s_3$ 內的點直接成為 skyline,$s_4$ 內的點

   直接舍去,因為它們顯然會被 $s_3$ 內的點支配,然后用 $s_3$ 內的點來消除 $s_1$ 和 $s_4$ 中的非 skyline 點。

       

 

5. Nearest Neighbor (NN)

   通過 $R$ 樹的 $NN$ 算法來找 Skyline 點。

   首先找到數據空間中距離原點最近的一個點,一般來說,任何距離指標都可以。這樣我們就可以找到點 $i$,這個點必然是一個 skyline 點。

   對於點 $i$,我們不需要考慮陰影區域中的那些點。區域 $1$ 也不需要考慮。事實上,在這個地區是沒有意義的。區域 $2$ 和區域 $3$ 必須進一步探索。

        

   在區域 $3$ 中執行相同的操作,即找距離原點最近的點,這樣就可以找到點 $a$,如下圖,同樣地,我們只需要關心區域 $3.2$ 和 $3.3$。

      

   在區域 $2$ 中搜索離原點最近的點,可以找到 $k$ 點。

        

   這個算法會經過 $3$ 次有效的 $NN$ 查詢和 $4$ 次空查詢。一般來說,如果 skyline 有 $s$ 個點,那么 $NN$ 執行 $s$ 次有用的 $NN$ 查詢和 $s+1$ 次空查詢。

    

 

6. Branch and Bound Skyline (BBS)

   基於best-first NN算法實現。首先建立 $R$ 樹。

             

   從根節點開始,算法過程如下:

       

        

       

     

   已經找到的 skyline 需要用來淘汰內存中排序的那些點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM