skyline query 学习笔记

        参考资料:https://blog.csdn.net/jeryjeryjery/article/details/79759286

       Skyline query是多维度数据库中一种非常重要的point query,它最初由 Börzsönyi 等人于2001年提出。一个数据库中的数据对象(也就是空间中的点)可能有成千上万个,但是我们往往对其中一些更感兴趣,Skyline就是定义这里的“更感兴趣”的一种方式。

       他们在论文中举了两个著名的例子。其中一个是纽约曼哈顿区天际线,在曼哈顿地区有许多高大漂亮的建筑,但是站在海岸线眺望时能够看到的建筑要么是离海岸线近的建筑,要么是比较高大的建筑,也就是那些无法被遮挡住的建筑才能被看到。这些建筑就构成了曼哈顿的轮廓天际线,英文称之为skyline,这也就是skyline名字的来源。Skyline query正是从这个想法出发提出的一种point query。 


        第二个例子是“Nassau旅馆”,假设去Nassau海滩旅游,大多数游客先肯定是想找离海滩近价格又便宜的旅馆,这个例子就是基于“价格便宜”和“离海滩近”两个目标。但是一般离海滩近的旅馆价格高一些,所以不会有一个确定的结果,只能返回一系列的结果供用户选择。这些旅馆的距离和价格都不比其他旅馆“差”,也就是返回值的点在同一价格上没有在距离上更近的点了。


1.dominate定义

  对应于前面的“遮挡”和“差”这个两个概念,Borzsony在论文中给出了支配(domination)的概念。

 Definition of point dominate:

a point A dominates another point B if and only if the coordinate of A on any axis is not larger than the corresponding

coordinate of B.

dominate的定义:

A dominate 点 B,当且仅当,A在任何轴的坐标值都小于等于B对应的轴的坐标值,并且不能全部等于.

我们以海边酒店为例,我们打算在海边订到酒店,希望酒店离海边越近越好,并且希望价钱也越便宜越好,

则在酒店这个对象上dominate的定义就是:

Definition: Hotel i dominates hotel f

if both distance and price of hotel i are smaller than or equal to those of hotel f AND both distance and price of

hotel i are NOT equal to those of hotel f.

定义: Hotel i dominate hotel f

如果hotel i 到海边的距离和价钱都小于或等于hotel f 到海边的距离和价钱,并且距离和价钱不全等(部分等,不能全

部等),那么就称hotel i dominate hotel f.


2.举例

以下图为例:其中点a dominate b和e; 点k dominate e和l; 点i dominate 除k和a外所有的点


下面是dominate的另一些例子: 





3.Skyline point的定义

有了dominate的定义之后,我们再定义skyline point: 


简而言之就是:skyline point 是点集中不会被其他点dominate的点

所以我们的目标就是:找出所有的不能被其他点dominite的点。

4.举例

以下面的酒店的例子为例: 


图中酒店有两个属性,一个是离海边的距离distance,另一个是价格price。我们将其绘画到坐标轴上:



现在我们要找出没有被其他点dominate的点,具体实现是: 

首先创建一个酒店的最小堆,堆中元素大小定义为(distance+price)之和,为了便于表达,我们将distance替换为x,

price替换为y,则是(x+y)和。为了找到skyline point,我们需要利用以下性质: 

1.堆中的第一个点(即最小点)一定是skyline point。

证明如下:假设该最小点m不是skyline point,也就是点m会被其他点dominate,假设这个点是点v。由于点v

dominate 点m,也就意味着v的(x, y)一定小于或等于点m的(x, y),即xv<=xm且yv<=ym,并且两者不全相等。

也就意味着(xv+yv)<=(xm+ym)。但是因为点m是堆中最小的点,也就是点m对应的(x+y)是最小的,

所以这与点m是最小点冲突,则不存在这样的点v,所以堆中的第一个点(最小点)一定是skyline point

2.判断某个点v会不会被其他点dominate,我们只需要判断已经是skyline point的点能不能dominate点v,如果这些

点无法dominate 点v,那么其他点更不用考虑。

证明:首先,能够dominate 点v 的点一定是先于 v 出最小堆的,因为它们拥有更小的 x 和 y,也就会拥有更小的(x + y)。

我们将先于点v出最小堆的点分为两大类,一类属于skyline point,假设为点集S; 另一类不属于skyline point

假设为点集U。点集U中的点,之所以不是skyline point,必定是被点集S中的点dominate,可能是直接dominate,

也有可能是间接dominate,因为dominate具有传递性,即点a dominate 点b, 点b dominate 点c,那么点a 也必定dominate

点c,根据dominate的定义能很好理解。所以,如果点v能够被点集U中的点dominate,根据dominate的传递性,

它也一定被点集S中的某个点dominate,所以如果点v不能被点集S中的点dominate, 则更不可能被点集U中的点dominate。

综合起来,我们不用考虑点集U中的点,只需要考虑点集S中的点,得证。


猜你喜欢

转载自blog.csdn.net/mx_studying/article/details/80766264