介绍

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

进行如下操作 :

  1. 设定ABC的迭代器下标为0
  2. 找出ABC列中第一个值的最大值,为2
  3. A从下标开始seek(2),找到3,下标移到seek(2)的位置
  4. B从下标开始seek(3),找到6,下标移到seek(6)的位置
  5. C从下标开始seek(6),找到8,下标移到seek(8)的位置
  6. A从下标开始seek(8),找到8,下标移到seek(8)的位置
  7. B从下标开始seek(8),找到8,下标移到seek(8)的位置
  8. C发现当前下标指向的值和8是一样的,说明8为A,B,C数列共有的值,记录8
  9. C的下标往前移动一位,重复上述步骤
  10. 直到有列 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:最坏情况下的最优连接算法相关推荐

  1. 连接定义点作用_最坏情况下最优连接(Worst-Case Optimal Joins)

    所谓最坏情况下最优连接(Worst-Case Optimal Joins),是一项关于数据库中连接操作的最新技术.给定若干表{R1, R2, ..., Rn},在它们之上的多表连接所能得到结果的数量上 ...

  2. 两个鸡蛋测试:从100层楼往下扔鸡蛋,求最坏情况下确认保证鸡蛋可以不破的最大楼层所需次数

    最坏情况下求得最优解所需的次数 内容说明 本文是在看过<<妙解谷歌压箱底面试题:如何正确的从楼上抛鸡蛋>>一文以后做的总结,该文章对此问题描写的很详细,但是在拜读的过程中也花了 ...

  3. 标准情况下的最优方案与魔鬼赛道

    ➤01 一封来信 尊敬的卓老师: 您好! 我是XYZ智能车团队的成员,在今天刚刚参加了安徽省省赛,我对于比赛场地有很大的质疑,整场比赛不规范,主办方学校队伍多次(三次以上)重新开始比赛就不说了,这一次 ...

  4. 下列各排序法中,最坏情况下的时间复杂度最低的是(**C** )A.希尔排序 B.快速排序 C.堆排序 D.冒泡排序

    下列各排序法中,最坏情况下的时间复杂度最低的是(C ) 希尔排序 A.快速排序 B.堆排序 C.冒泡排序 D.正确答案:C 题目解析: 堆排序最坏情况时间下的时间复杂度为 O(nlog2n) :希尔排 ...

  5. 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破。给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数。

    有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破.给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数.(假设每次摔落时,如果没有摔 ...

  6. 设有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个升序表,并在最坏情况下比较的总次数达到最 ...

  7. 最坏情况为线性时间的选择算法(SELECT)

    该文章参考(代码参考进行修改已经验证)--来源作者博客 算法思想 1.将数组的 n 个元素划分为 [n/5](向下取整)组,每一组5个元素,且至多只有一组由剩下的 n mod 5 个元素组成 2.寻找 ...

  8. 最坏情况为线性时间的选择算法

    最坏情况为线性时间的选择算法 参考:[算法]算法导论:https://www.bilibili.com/video/BV1Tb411M7FA?p=6 提出问题:从一个数组中找到第K个最大数字,即TOP ...

  9. 在服务端没接显示器的情况下,nomachine远程连接客户端看到的是黑屏的问题

    这里遇到一个问题,在服务端没接显示器的情况下,nomachine远程连接客户端看到的是黑屏(我这里服务器是ubuntu18.04) 参考链接:https://blog.csdn.net/c133111 ...

最新文章

  1. 还在用JDK6的同学,来看看JDK13新特性详解吧
  2. 把php写入织梦,dedeCMS远程写入getshell(测试版本V5.7)
  3. Linux环境下USB的原理、驱动和配置
  4. VTK:可视化之LabeledDataMapper
  5. 函数使用了堆栈的字节超过_单片机地址空间,堆栈理解
  6. .NET Core实战项目之CMS 第十七章 CMS网站系统的部署
  7. python库--pandas--Series.str--字符串处理
  8. 信息学奥赛一本通 1101:不定方程求解 | OpenJudge NOI 2.1 7650 | 小学奥数 7650
  9. 精品家具办公桌椅企业html5官网模板
  10. Cocos2dx源码记录(6) CCTrianglesCommand
  11. Windows下开源截屏工具软件Free Shooter
  12. 37种传感器(四)之光敏电阻传感器模块+Stduino NanoUNO
  13. python面板数据分析代码_面板数据分析是什么如何进行面板数据分析?
  14. JAVA 获取今天、昨天、上周等日期
  15. JQ与JS实现全选按钮案例
  16. 永磁同步直线电机驱动控制原理与matlab建模仿真
  17. 计算机硬件故障照片,计算机硬件故障的识别与处理
  18. VMware Tools 详细安装教程及问题解决
  19. php 获取百度权重,PHP获取网站在爱站查询的百度权重
  20. 如何快速上手开发微信小程序?

热门文章

  1. 计算公式(java实现)
  2. 仙气满满的霍尊竟然这么皮?自爆体重已经突破……
  3. 前端该如何评估开发时间
  4. 购书 (C++)简单贪心
  5. STM32单片机CAN总线汽车自动会车灯远近光切换
  6. 实现自动按键的方法 驱动级模拟(硬件模拟)
  7. C语言笔试题(嵌入式软件开发)
  8. Android Studio Gradle 下载过慢?Gradle 配置阿里云镜像
  9. 如何打开 plist 文件
  10. Python数据分析入门——数据分析基础步骤知识