Leapfrog Triejoin:最坏情况下的最优连接算法
介绍
leapfrog triejoin是商业数据记录系统 LogicBlox® 采用的一种新颖的连接算法,在不同的基准测试中表现出色。leapfrog triejoin论文的写作者认为这个算法,即使在完全连接的最坏情况下也能提供最优解,是NPRR算法(另外一个最坏情况下join优化算法)的竞争对手,并且leapfrog triejoin算法容易学习和实现,结论证明很简单。
论文地址:Leapfrog Triejoin: A Worst-case Optimal Join Algorithm – LogicBlox
Leapfrog Triejoin
Leapfrog Triejoin是sort merge join的一种变体。
定义几个接口:
- int key() 返回当前迭代器的位置
- next() 返回下一个迭代器位置
- seek(int seekKey) 返回>=seekKey的第一个迭代器的位置,没有就返回末尾
- bool atEnd() 查看迭代器是否在结尾,是就返回true
论文大概看了一下,单纯看算法实现,其实还挺简单的。
它可以计算A1 ∩ · · · ∩ Ak的交集,A1,A2,A...理解成数列就行。
用论文中的这个图来介绍一下算法的具体流程。
现在假设有A,B,C三个列,均为排好序的数列。
A:0 1 3 4 5 6 7 8 9 11
B:0 2 6 7 8 9 1e9
C:2 4 5 8 10
进行如下操作 :
- 设定ABC的迭代器下标为0
- 找出ABC列中第一个值的最大值,为2
- A从下标开始seek(2),找到3,下标移到seek(2)的位置
- B从下标开始seek(3),找到6,下标移到seek(6)的位置
- C从下标开始seek(6),找到8,下标移到seek(8)的位置
- A从下标开始seek(8),找到8,下标移到seek(8)的位置
- B从下标开始seek(8),找到8,下标移到seek(8)的位置
- C发现当前下标指向的值和8是一样的,说明8为A,B,C数列共有的值,记录8
- C的下标往前移动一位,重复上述步骤
- 直到有列 atEnd() 了,结束
以上就是Leapfrog Triejoin的使用例子,举一反三,应该也知道这个算法是怎么操作的了。
至于Leapfrog Triejoin的最坏情况复杂度分析,感兴趣的可以直接看论文。
Leapfrog Triejoin的多条件扩展
(这里我只说说我的理解,因为原论文中说的是在join中的应用,但是我看了半天都没看出有两张表join的情况,可能我确实没理解作者的意图)
上面的情况只是求多个数列的交集,结果是一个,那么如果我有多个条件呢?
比如,我现在有一张含有3个列A,B,C的表,表已经按照A,B,C排好序。
有3个需求:
- 第一个需求我要找A=B+1的
- 第二个需求我要找A=C的
- 第三个需求我要找B<C的
那么很简单啊,如果我想要满足这三个需求的数据,我直接for循环一遍表,判断一遍就可以了。
但是如果我有不同的业务,每个业务可能需要不同的需求呢?
有4个业务:
- 第一个业务需要满足第一个和第二个需求
- 第二个业务需要满足第一个和第三个需求
- 第三个业务需要满足第二个和第三个需求
- 第四个业务需要满足第一,二,三个需求
那么需要走四遍循环么?
作者提出了用Leapfrog Triejoin解决这个问题,和上面一样,A,B,C还是分到三个深度里,每行中的值还是代表A或者B或者C的值。不过值之间添加了树形结构,表示满足的需求,或者说需要满足的“关系”。
举个例子就能明白了。
都是有a,b,c三列的图,有三个关系R(a,b),S(b,c),T(a,c)
以第一张图的为例,按照关系,根据a,b,c的值来建树。
- 满足R(a,b)关系的a,b值有7-4
- 满足S(b,c)关系的b,c值有4-1,4-4,4-5,4-9
- 满足T(a,c)关系的a,c值有7-2,7-3,7-5
那么代表R(a,b),S(b,c),T(a,c)关系的树就建好了。
然后就是按照深度a,b,c来对需要的关系树进行Leapfrog Triejoin。
如果要同时满足R,S,T,步骤如下:
- 转到深度a,搜索三棵树R,S,T
- 在R中发现7,记录7
- S没有这层深度数据,跳过
- 在T中发现7,记录7
- 回到R,发现上一步记录的7和当前迭代器的值相同,临时结果中记录下7
- 在a为7基础上,转到深度b,搜索三棵树R,S,T
- 在R中发现4,记录4
- 在S中发现4,记录4
- T没有这层深度数据,跳过
- 回到R,发现上一步记录的4和当前迭代器的值相同,临时结果中记录下4
- 在b为4基础上,转到深度c,搜索三棵树R,S,T
- R没有这层深度数据,跳过
- 在S中seek(2),得到4
- 在T中seek(4),得到5
- R没有这层深度数据,跳过
- 在S中seek(5),得到5
- 回到T,发现上一步记录的5和当前迭代器的值相同,临时结果中记录下5
- 重复上述步骤直到atEnd()
得到符合条件的行值(7,4,5)
同理,第二幅图中也可以得到(7,4,0),(7,4,1),(7,4,2)
Leapfrog Triejoin的代码项目
在git中找到了一个java版本的项目:
https://github.com/Jorricks/Caching-LFTJ.git
感兴趣的可以看一下
Leapfrog Triejoin:最坏情况下的最优连接算法相关推荐
- 连接定义点作用_最坏情况下最优连接(Worst-Case Optimal Joins)
所谓最坏情况下最优连接(Worst-Case Optimal Joins),是一项关于数据库中连接操作的最新技术.给定若干表{R1, R2, ..., Rn},在它们之上的多表连接所能得到结果的数量上 ...
- 两个鸡蛋测试:从100层楼往下扔鸡蛋,求最坏情况下确认保证鸡蛋可以不破的最大楼层所需次数
最坏情况下求得最优解所需的次数 内容说明 本文是在看过<<妙解谷歌压箱底面试题:如何正确的从楼上抛鸡蛋>>一文以后做的总结,该文章对此问题描写的很详细,但是在拜读的过程中也花了 ...
- 标准情况下的最优方案与魔鬼赛道
➤01 一封来信 尊敬的卓老师: 您好! 我是XYZ智能车团队的成员,在今天刚刚参加了安徽省省赛,我对于比赛场地有很大的质疑,整场比赛不规范,主办方学校队伍多次(三次以上)重新开始比赛就不说了,这一次 ...
- 下列各排序法中,最坏情况下的时间复杂度最低的是(**C** )A.希尔排序 B.快速排序 C.堆排序 D.冒泡排序
下列各排序法中,最坏情况下的时间复杂度最低的是(C ) 希尔排序 A.快速排序 B.堆排序 C.冒泡排序 D.正确答案:C 题目解析: 堆排序最坏情况时间下的时间复杂度为 O(nlog2n) :希尔排 ...
- 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破。给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数。
有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破.给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数.(假设每次摔落时,如果没有摔 ...
- 设有6个有序表A、B、C、D、E、F,分别含有10、35、40、50、60和200个数据元素,各表中元素按升序排列。要求通过5次两两合并,将6个表最终合并成1个升序表,并在最坏情况下比较的总次数达到最
设有6个有序表A.B.C.D.E.F,分别含有10.35.40.50.60和200个数据元素,各表中元素按升序排列.要求通过5次两两合并,将6个表最终合并成1个升序表,并在最坏情况下比较的总次数达到最 ...
- 最坏情况为线性时间的选择算法(SELECT)
该文章参考(代码参考进行修改已经验证)--来源作者博客 算法思想 1.将数组的 n 个元素划分为 [n/5](向下取整)组,每一组5个元素,且至多只有一组由剩下的 n mod 5 个元素组成 2.寻找 ...
- 最坏情况为线性时间的选择算法
最坏情况为线性时间的选择算法 参考:[算法]算法导论:https://www.bilibili.com/video/BV1Tb411M7FA?p=6 提出问题:从一个数组中找到第K个最大数字,即TOP ...
- 在服务端没接显示器的情况下,nomachine远程连接客户端看到的是黑屏的问题
这里遇到一个问题,在服务端没接显示器的情况下,nomachine远程连接客户端看到的是黑屏(我这里服务器是ubuntu18.04) 参考链接:https://blog.csdn.net/c133111 ...
最新文章
- 还在用JDK6的同学,来看看JDK13新特性详解吧
- 把php写入织梦,dedeCMS远程写入getshell(测试版本V5.7)
- Linux环境下USB的原理、驱动和配置
- VTK:可视化之LabeledDataMapper
- 函数使用了堆栈的字节超过_单片机地址空间,堆栈理解
- .NET Core实战项目之CMS 第十七章 CMS网站系统的部署
- python库--pandas--Series.str--字符串处理
- 信息学奥赛一本通 1101:不定方程求解 | OpenJudge NOI 2.1 7650 | 小学奥数 7650
- 精品家具办公桌椅企业html5官网模板
- Cocos2dx源码记录(6) CCTrianglesCommand
- Windows下开源截屏工具软件Free Shooter
- 37种传感器(四)之光敏电阻传感器模块+Stduino NanoUNO
- python面板数据分析代码_面板数据分析是什么如何进行面板数据分析?
- JAVA 获取今天、昨天、上周等日期
- JQ与JS实现全选按钮案例
- 永磁同步直线电机驱动控制原理与matlab建模仿真
- 计算机硬件故障照片,计算机硬件故障的识别与处理
- VMware Tools 详细安装教程及问题解决
- php 获取百度权重,PHP获取网站在爱站查询的百度权重
- 如何快速上手开发微信小程序?