位图(Bitmap)算法最先由Kian-Lee Tan在2002年提出,相比于之前该算法的一个创新之处在于只需要把数据点的为所有维度值转化为一个位串,把所有的数据点转化位向量合起来即形成位图。然后进行与运算就判断是否为SP点。
为了更加形象的展示这个算法的流程,笔者简单的演示这个算法流程:
如下表所示的10个数据点
数据点 坐标 位向量
p1 (2,5) (11111110,111110000)
p2 (3,6) (11111100,111100000)
p3 (5,8) (11110000,111000000)
p4 (4,4) (11111000,111111000)
p5 (2,10)(11111110,100000000)
p6 (9,2) (10000000,111111110)
p7 (1,9) (11111111,110000000)
p8 (7,3) (11100000,111111100)
p9 (8,1) (11000000,111111111)
p10 (5,5) (11110000,111110000)
其转换规则如下:
待测数据集是由d维数据点组成的数据集,任意一个数据点p(p1,p2…pd),假设在某i维(1≤i≤d)上有ki个不同属性值,数据集在i维上有ki个不同的值。将他们从大到小排列pi1> pi2>…> piki,没个数据点中第i维的值转化ki个位串,将其投影在[0…1]中,其转化规则是:数据点p在第i维的值为pi,用value(pi)代表pi在上面排第value(pi)位,则根据算法中的规则,从最高位到value(pi)位赋值1,从value(pi)-1位开始的赋值0形成一个位串,将d个位串合起来就形成一个位向量,将所有数据点转换成位向量即可变成一张位图。
把上表的数据的两个维度转化成位图即如下
d1 d2
9 8 7 5 4 3 2 1 10 9 8 6 5 4 3 2 1
1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0
1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0 0
1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0
1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0
1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0
接下来就可以来寻找每个点的列位串并进行算法流程演示。
如p1点的坐标值(2,5),把A定义为p1点第一维度坐标值的列位串,把B定义为p1点第二维度坐标值的列位串,首先确定p1点在一维上的值为2,在bitmap中找到第一维度上的“2”,然后按列取串即可得A。同理在第二维度“5”中按列取串即可得到B。如图所示取第一个数据点的列串。
可以采用MATLAB编写了这个算法,这个算法中有比较多的按列取串等,在矩阵中可以比较容易的实现。而且MATLAB中有较多的函数可以直接进行排序等。
close all;
clear;
clc;
tic
m=500;
n=2;
flag=0;
a=1;
flag_bitmap=0;
%point=[2,5;3,6;5,8;4,4;2,10;9,2;1,9;7,3;8,1;5,5];
point=100*rand(m,n);%生成30行2列的位于(0,1)的数据点在乘100
point_1=point(:,1);
point_2=point(:,2);
point_1_sort=unique(point_1);
point_2_sort=unique(point_2);
point_1_sort=sort(point_1_sort,'descend');
point_2_sort=sort(point_2_sort,'descend');
len_point1=length(point_1_sort);
len_point2=length(point_2_sort);
for i=1:m
for j=1:len_point1
if((point_1(i)~=point_1_sort(j)) && (flag==0))
bitmap_1(i,j)=1;
else
if(point_1(i)==point_1_sort(j))
bitmap_1(i,j)=1;
flag=1;
else
if((point_1(i)~=point_1_sort(j)) && (flag==1))
bitmap_1(i,j)=0;
end
end
end
end
flag=0;
end
flag=0;
for i=1:m
for j=1:len_point2
if((point_2(i)~=point_2_sort(j)) && (flag==0))
bitmap_2(i,j)=1;
else
if(point_2(i)==point_2_sort(j))
bitmap_2(i,j)=1;
flag=1;
else
if((point_2(i)~=point_2_sort(j)) && (flag==1))
bitmap_2(i,j)=0;
end
end
end
end
flag=0;
end
for i=1:m
for j=1:len_point1
if(point_1(i)==point_1_sort(j))
temp_1=j;
end
end
for j=1:len_point2
if(point_2(i)==point_2_sort(j))
temp_2=j;
end
end
for k=1:m
temp_A=bitmap_1(k,temp_1);
temp_B=bitmap_2(k,temp_2);
temp_C=temp_A & temp_B;
if(temp_C==1)
flag_bitmap=flag_bitmap+1;
end
end
if(flag_bitmap==1)
final(a,1)=point(i,1);
final(a,2)=point(i,2);
a=a+1;
end
flag_bitmap=0;
end
final
plot(point(:,1),point(:,2),'*');
hold on
plot(final(:,1),final(:,2),'ro');
legend('all point','skyline point');
toc
下面是仿真结果:
[1] Borzsony S, Kossmann D, Stocker K. The Skyline operator[C]// International Conference on Data Engineering, 2001. Proceedings. IEEE Xplore, 2001:421-430.
[2] Kossmann D, Ramsak F, Rost S. Shooting stars in the sky: an online algorithm for skyline queries[C]// VLDB 2002, Proceedings of, International Conference on Very Large Data Bases, August 20-23, 2002, Hong Kong, China. DBLP, 2002:275-286.
[3] 朱琳, 关佶红, 周水庚. Skyline计算研究综述[J]. 计算机工程与应用, 2008, 44(6):160-165.
[4] 魏小娟, 杨婧, 李翠平,等. Skyline查询处理[J]. 软件学报, 2008, 19(6):1386-1400.