from:http://www.cnblogs.com/jcli/p/3984809.html

如果待合并的两个倒排表数据量很大, 但是交集很少时, 会是什么情况呢?
1
2
[1, 2, 3, 4, 5, ... 10001, 10005]
[1, 10001, 10008]

如果对这两个做合并操作, 最后的交集结果只有  [1, 10001] 2个元素, 但是却要做10001次移动和比较操作, 所以肯定有什么办法来优化这一点. 可能你已经想到了, 我们做了这么多无用比较, 是因为我们每次指针向前移动的步子太小了点, 如果我们在每次比较后向前多移动一点, 可以忽略很比无用的操作. 这就是跳表的思想.

我们看第一个倒排表, 如果它以5000为步长前进, 进我们只需要向前查找两个即可找到我们需要的元素: 10001 . 这里写一个跳表功能的合并算法代码:

a = range(10008)
b = [1, 10001, 10008]i = j = 0
result = []
step = 100
count = 0
while i < len(a) and j < len(b):if a[i] == b[j]:result.append(a[i])i = i +1j = j + 1count = count + 1elif a[i] < b[j]:while (i + step < len(a)) and a[i+step] <= b[j]:i = i + stepcount = count + 1else:i = i + 1count = count + 1else:while (j + step < len(b)) and b[j+step] <= a[i]:j = j + 5000count = count + 1else:j = j + 1count = count + 1print result
print count

上面代码中故意构造了一个很大的集合 [0 ... 10007], 然后用变量count作为计数器来分析两个算法分别执行的操作次数, 可以看到采用跳表算法时(我们模拟了step=100)的计算次数是207, 而用之前的方式计算次数是10008, 可见性能提升了很多倍.

这里有几点说明下:

1. 这里为了简单说明跳表的思路, 全部用了数组表示倒排表, 其实真实的数据结构应该是链表结构(linked list). 这才符合磁盘存储结构.

2. 跳表的原始结构算法比这个复杂, 而且根据场景的不同, 跳表有不同的实现. 这里因为不是利用跳表的快速查询功能, 所以没有多级指针索引概念, 详细跳表实现查考: skip list

转载于:https://www.cnblogs.com/bonelee/p/6589839.html

倒排索引优化 - 跳表求交集 空间换时间 贪心相关推荐

  1. 倒排索引优化 - 跳表求交集 空间换时间

    lucene中用的是ConjunctionScorer ,大致过程是每条倒排链不断的推进到小于等于当前最大节点的位置.当然实现细节还是很丰富的,作者很细心的把过程都列出来了,建议顺着读一边.这里摘抄部 ...

  2. 空间换时间,查表法的经典例子

    前言 上一篇分享了:C语言精华知识:表驱动法编程实践 这一篇再分享一个查表法经典的例子. 我们怎么衡量一个函数/代码块/算法的优劣呢?这需要从多个角度看待.本篇笔记我们先不考虑代码可读性.规范性.可移 ...

  3. JS哈希表算法——空间换时间

    题目来源力扣: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素 ...

  4. 以空间换时间——动态规划算法及其应用:矩阵链相乘

    动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...

  5. 前端遍历导致查询数据时间过长_OLAP 服务器,空间换时间可行吗?

    [摘要] 全量预汇总真的是提高 OLAP 性能的可行方案吗?点击了解OLAP 服务器,空间换时间可行吗? 多维分析提供拖拽.旋转.切片.钻取等等人机交互操作,必须有秒级的响应速度.而这些操作对应的明细 ...

  6. FPGA之道(62)时空变换之空间换时间

    文章目录 前言 时空变换之空间换时间 缓存提速使用 模块复制 同频模块复制 缓存降频复制 缓存降频使用 逻辑拆分 流水线 流水线的由来 如何在组合逻辑中使用流水线 如何在时序逻辑中使用流水线 顺序系统 ...

  7. ie浏览器查看vue中js_浅析 Vue.js 中那些空间换时间的操作

    Hello,各位小伙伴,接下来的一段时间里,我会把我的课程<Vue.js 3.0 核心源码解析>中问题的答案陆续在我的公众号发布,由于课程的问题大多数都是开放性的问题,所以我的答案也不一定 ...

  8. 什么叫用空间换时间,用时间换空间

    什么叫做用空间换时间 用空间换时间是指为了提高程序或算法的效率,将计算机程序中的时间复杂度转化为空间复杂度,即通过使用更多的空间来减少程序运行所需的时间.这种技术在某些情况下可以大幅缩短程序的执行时间 ...

  9. leetcode-383-Ransom Note(以空间换时间)

    题目描述: Given an arbitrary ransom note string and another string containing letters from all the magaz ...

最新文章

  1. Linux中rsync备份数据使用实例
  2. 自然语言处理NLP之文本蕴涵、智能问答、语音识别、对话系统、文本分类、情感计算
  3. 2020年12月份学习总结,PMP与信息系统项目管理师的回顾
  4. 网口扫盲二:Mac与Phy组成原理的简单分析(转)
  5. python3数据库配置,远程连接mysql服务器
  6. ***经验谈之SA权限***的感悟
  7. 如何设置VSCode以提高生产力
  8. Bootstrap 导入插件
  9. 日常生活中女性的弱点是什么?
  10. 三周第四次课(12月28日)
  11. 微软已成全球SaaS老大,谁将成为中国SaaS行业龙头
  12. 怎么在html中加水印,如何在h5网页添加水印
  13. 一个完整的计算机系统五个基本部分组成,一个完整的计算机系统
  14. 抓取新浪微博好友昵称和性别
  15. 解决CSDN markdown编辑器插入图片去除水印
  16. 妹子:我都这样给你讲类加载器了,还不懂!
  17. 关系型数据库--关系代数
  18. python编制剪刀石头布游戏_Python编辑剪刀石头布游戏
  19. 【JOURNAL】怎么计算4万亿
  20. JavaScript自学基础

热门文章

  1. Linux下的USB总线驱动 3
  2. 使用xdebug+wincachegrind的心得
  3. android 点击热区,Android-android中有没有提供点击热区的功能
  4. ttc转ttf在线网站_文件格式怎么在线互转?迅捷PDF转换器告诉你
  5. java月份列表_java – 如何获取两个日期之间的月份和年份列表
  6. linux创建文件怎么输入换行_Revit 怎么创建自定义的族文件?
  7. 计算机能力操作系统试题,全国计算机一级考试操作系统论述题及答案
  8. oracle 11g 企业版 标准版,Oracle 数据库11g 第 2 版 标准版、企业版 下载
  9. linux定时任务配置失效,linux下定时任务和延迟任务
  10. 引用http开头的JS失败以及laravel的url()方法的坑