背景
当在处理酒店排序,餐馆排序这类问题时,会遇到类似问题:A的价格便宜,但是卫生不好;B的价格略高,但是距离比较近。如何给用户排序呢?如果这种候选结果特别多,如何快速给出topN呢?这种应用场景非常的常见,在职位搜索和简历推荐的时候也会有这种情况,如:A职位的公司比较好,但是工资低;B职位的福利比较好,但是距离家远;或者是 A的工作经验很多,但是要工资高;B的毕业学校很好,但是工作经验少,该推荐哪个人给公司HR呢?
###常规处理办法
对于这类问题,通常采用加权平均的方法,也就是给每一类属性给一个加权公式,然后得到该候选项的总分,然后对总分排序。
这种解决方法看似公平,但是又出现了其他问题,那就是这是假定在了一个评价公式的前提之下的。
###Skyline要解决的问题
####核心思想:找出亮点
####定义:如果点A在所有的特征上均大于等于点B的特征,并且存在至少一个特征大于B的特征,那么我们就说A统治了B。(其实也就是说,A在任何一方面都不比B差)
####方法1:两个for循环,挨个比较所有的点,如果A统治B,那么去掉B,A变成统治点;否则,下一个;
方法1的复杂度:
####改进的方法1:加入预排序
第一步:把所有的特征加和,然后倒序排列
第二步:把第一个点直接放入S(skyline set),然后从下一个点开始跟S中的点进行比较,如果被统治,则扔掉;否则,加入S
时间复杂度降低
####Refer
http://www.ccs.neu.edu/home/jarodwen/materials/skyline_pre.pdf