假設一個數據庫存儲每個酒店的以下信息:它的價格(夜間價格)、離海灘的距離。用戶希望檢索“最佳”酒店,如何比較兩個酒店的質量呢?
$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 需要用來淘汰內存中排序的那些點。
