海量数据超快查询的秘密-跳表思想 by彭文华

简介: 海量数据超快查询的秘密-跳表思想 by彭文华

这是彭文华的第163篇原创

今天是初三,恰逢情人节,也没提前准备啥礼物,就陪媳妇回娘家探亲。老丈人家一堆的小朋友,非常热闹。

我家娃是个孩子王,往年都用暴力征服小朋友,今年居然动脑筋了。他给一堆孩子出了一个题,是这样的:

随便来一个小朋友,心里想一个1-1000的数,他通过10个问题,猜出心中的那个数是多少。如果10个问题问完,猜中了,就得给他捶背5分钟。


过年做客么,除了聊天也没啥事,我就在旁边观察了半天,发现我家娃用一招搞定了所有小朋友,不仅享受了很久的“捶背”服务,还成为新晋“孩子王”。


他用的是啥招呢?其实是一个非常简单的方法-二分法。有些算法基础比较好的同学已经知道怎么回事了。你听我慢慢讲。


对了,我在挑战春节不打烊,每天都分享原创文章,欢迎加我个人微信:shirenpengwh,加入催更群,小鞭子催我快快写稿


二分查找

二分查找,也叫折半查找,是一个非常高效的查找方法。简单来说,就是通过多次减半查找,缩小数据范围,最终找到想找的那个数据。

就拿我儿子的那道题来说,目标是在10个问题之后,准确得知你心中想的那个1-1000之间的那个数字,具体操作方法如下:

问题1:这个数字是大于500对吗?无论答案是“是”还是“否”,都直接排除掉另外500个数字,这是第一次“折半”。咱假设是小于500.

问题2:这个数字是在1-250之间对吗?同样,无论答案是什么,都再次排除掉250个数字。这是第二次“折半”。

以此类推,10个问题问完,答案自然就出来了。为了节省篇幅,我编了一个excel表,你应该能快速看明白。

因为回答是什么都无所谓,我们都可以排除掉相应数量的错误答案。经过10个问题之后,就能排除999个答案,剩下那个自然就是正确答案了。

如果你数字足够敏感,就会发现,其实1000这个数字其实可以扩展到1024,也一样能达到效果,因为2的10次方就等于1024啊。1024对半砍10次,就能确定某个数字。


跳表的秘密

这个回答好像很简单?其实这是非常厉害的方法。一般人会怎么做?基本上就一个方法:瞎猜。因为另外一个方法基本没人用,就是从1开始,挨个猜,就是穷举法,感觉太笨了。

但是这两种方法效率都非常慢,因此非常不推荐。其实按个猜的这种穷举法,其实就是数据库中的全表扫描,速度自然是非常非常慢的。

而二分法这种思想,拓展一下就是跳表,也就是索引的核心思想。

跳表其实就是一个不断问数据库问题的方法,能够快速锁定数据所在的位置。

你看,这个跳表跟我儿子玩的那个猜数字的游戏多像啊?其实就是因为核心思想是一样的。对于海量数据,我们只需要对序号进行多层级的“折半查找”,就能快速锁定数据所在的地方,而不用挨个找。

不过我这张图画的不好,有人会问,这从1开始找不是第二条就找到了么?咱看图看意哈,这个思想可以搞定千万、亿级甚至更多数据的快速查找和锁定。

这种方法耗费的存储量也很小,因为只需要存储id就行,而且层级越往上,存储的数据就越少。

这个解决方案其实就是我们说的“索引”。而那么多问题其实就是一级索引、二级索引、三级索引。


当然,在数据库实际的使用中,还会遇到各种问题,比如插入新数据了,删掉老数据了。当某个老区域中的数据插入过多之后,这个区域的索引就不好使了,查询到这边的时候速度就会变慢。这就是插入、删除数据频繁的表,我们需要过一些时间就重建索引的原因。


跳表思想的扩展

跳表思想广泛应用于各个领域,当然应用最多的当然是数据领域了。别的不说,关系型数据库的索引就是跳表思想,MySQL面试题中肯定有这个的。算法题里也有大量跳表思想的题,实现方式也很简单,写个循环,不断/2就行了。


熟悉Redis的同学,应该知道对有序集合额(zset)的操作中国,就有按照范围区间查找元素的操作,这就是用跳表搞定的,效率非常高。


另外,HBase MemStore的内部存储就是用跳表思想搞定的。HBase实时写数据会先扔到内存里,然后再通过flush机制刷写到磁盘,生成StoreFile有序文件。跳表天然有序,并且查找、插入、删除性能都非常高,HBase当然就拿来就用了。这也是HBase查询效率超高的原因之一。


总结

如果你想搞定女朋友,也可以用这个方法,让她心中想一个数字,然后用二分法,十次锁定答案,然后你就可以嘿嘿嘿...

二分法进一步扩展,就是跳表思想,对一个顺序链表提取多层索引,通过少量存储消耗,极强的增加查询效率。二分法30层就可以覆盖10亿条数据,这个量级就很恐怖了。

跳表思想广泛应用于各种查询领域,传统关系型数据库的索引就用了跳表思想。内存(缓存)数据库Redis也用了跳表实现查找元素的操作。大数据组件中专攻快速查询的HBase组件的MemStore内部存储也用的跳表思想,这也是HBase查询速度超远的原因之一。

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
40 4
|
4月前
|
算法 搜索推荐 数据处理
震惊!Python算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
【7月更文挑战第24天】在编程世界里, Python以简洁强大备受欢迎, 但算法设计与复杂度分析对程序性能至关重要。算法是程序的灵魂, 其效率直接影响数据处理能力。时间复杂度衡量算法执行速度, 如冒泡排序O(n²)与快速排序O(n log n)的显著差异; 空间复杂度关注内存占用, 递归算法需警惕栈溢出风险。优秀算法需平衡时间和空间效率, 深入理解问题本质, 迭代优化实现高效可靠。
36 2
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | 不愧是腾讯,问基础巨细节 。。。
**摘要:** 本文介绍了Adaboost算法的基本概念、工作原理和数学基础,它是由 Freund 和 Schapire 在 1996 年提出的迭代机器学习算法,通过组合多个弱分类器形成强分类器。Adaboost 通过调整样本权重,重点关注被错误分类的样本,以提高分类性能。文章还提供了代码示例,展示了如何使用决策树作为弱分类器,并在鸢尾花数据集上应用 Adaboost 分类器。此外,还讨论了Adaboost的优缺点及适用场景,强调其在分类问题上的高效性和广泛应用。
46 1
算法金 | 不愧是腾讯,问基础巨细节 。。。
|
5月前
技术好文共享:蒙提霍尔悖论(三门问题)终极分析
技术好文共享:蒙提霍尔悖论(三门问题)终极分析
43 1
|
5月前
|
存储 机器学习/深度学习 算法
【海贼王的数据航海】探究二叉树的奥秘
【海贼王的数据航海】探究二叉树的奥秘
28 0
|
6月前
|
SQL 存储 前端开发
数据库系统概念(第二周 第一堂)
数据库系统概念(第二周 第一堂)
|
数据采集 机器学习/深度学习 人工智能
教科书级数据is all you need:1.3B小模型逆袭大模型的秘密
教科书级数据is all you need:1.3B小模型逆袭大模型的秘密
254 0
|
存储 算法 搜索推荐
408王道数据结构强化——应用题(三)
408王道数据结构强化——应用题
307 1
408王道数据结构强化——应用题(三)