图解数据库skyline查询

假设一个数据库存储每个酒店的以下信息:它的价格(夜间价格)、离海滩的距离。用户希望检索“最佳”酒店,如何比较两个酒店的质量呢?

                        

a 比 b好吗?是的,a 酒店比 b 酒店更便宜,而且离海滩更近,我们说 a 支配 b。 a 是不是比 i好呢?它们是不可比的。一些用户可能更喜欢 a(因为它离海滩更近),而另一些用户可能更喜欢 i(因为它更便宜)。skyline 包含了所有不受其它酒店支配的酒店。skyline = {a,i,k},而非 skyline 酒店在大多数情况下不会被用户考虑。

skyline 查询算法用到了两个重要的性质:

   1)支配传递性:如果 p1 支配 p2,p2 支配 p3,那么我们就有 p1 支配 p3。

   2如果一个点不能支配另一个点,那么反之亦然。

1. Block Nested Loop (BNL) 

   这个是最基本的查询算法,通过暴力搜索,判断每个酒店是否有被其他酒店支配,平方时间复杂度。

2. Sort First Skyline (SFS)

   SFS是一种改进的BNL。首先根据(单调)偏好函数对整个数据集按某个维度进行排序。然后按 BNL 算法计算。

3. SCAN 扫描算法

   顺序扫描表格,扫描过程中维护可能成为 skyline 点的列表,假设内存允许在 List 中最多保留 3 个条目。

   首先初始化 List,即将 a 加入 List, List = {a},接下来顺序扫描表格中的其它点,做如下两个判断:

       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 = {a,c}。

   4因为 d 不被 List 里面的点支配,也不支配 List 里的点,所以 d 加入 List, List = {a,c,d}。

   5因为 a 支配 e,所以丢弃 e。

   6f 应该加入 List,但 List 已经满了,所以将 f 写入磁盘文件,并标记所有当时在 List中的点 List = {a′,c′,d′}, File = {f}。(这里说一下为什么d和f不相互支配呢?因为我们共有3个指标,距离最小、价格最低、距离又短价格又低,对于第三个要同时满足2个条件才可以,而d和f这两个并不能同时满足)

   7因为 g 支配 List 里面的 d,所以用 g 替换 d, List = {a′,c′,g}, File = {f},g 是没有标记的。

   8因为 h 支配 List 中的 c,g,所以用 h 替换 c,g,List = {a′,h}, File = {f}

       ....

   9因为 i支配 h,所以用 i 替换 h, List = {a′,i}, File = {f}

   10List = {a′,i,k}, File = {f}

   11l,m,n 均被舍弃。

   12List 中有标记的点就是 skyline 点,然后还要针对 file 再做一遍 SCAN。

   13结果 S={a,i,k}。

4. Divide and Conquer (D&C)

   把点分成几组,使得每组的数据都能够放进内存。分别处理这些组,然后合并它们的结果。s3 内的点直接成为 skyline,s4 内的点直接舍去,因为它们显然会被 s3 内的点支配,然后用 s3内的点来消除 s1 和 s4 中的非 skyline 点。

       

 

5. Nearest Neighbor (NN)

   通过 R 树的 NN 算法来找 Skyline 点。

   首先找到数据空间中距离原点最近的一个点,一般来说,任何距离指标都可以。这样我们就可以找到点 i,这个点必然是一个 skyline 点。

   对于点 i,我们不需要考虑阴影区域4中的那些点。区域 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 树。

             

   从根节点开始,算法过程如下:(图中<e7,4>表示N7这个矩形框的左下角坐标到原点的曼哈顿距离(多谢@颜凌巍的解答))

       

        

       

     

   已经找到的 skyline 需要用来淘汰内存中排序的那些点。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值