【编程珠玑】查找、排序、B+树

Codeeror 2020-04-20

前言

《编程珠玑》确实是一本好书,它里面对算法和数据结构的解读,对问题的分析可以很好帮助编程人员转变以往对数据结构和算法的态度发生改变,转向重视;本文重点谈谈里面的查找和排序;

查找

查找,查找之中,最重要的概念是二分查找,很多数据结构其实都应用了二分查找的理念,例如跳表、红黑树、B+树

应用:数据库

一个应用问题要选对数据结构是最重要的事情,我们知道很多时候,程序员需要在时间和空间上面做取舍,选对结构后是时间和空间的开销兼得的重要方式之一;

为什么是B+树?经常会有人对数据库的数据结构提这个疑问,其实答案就是因为B+树能满足以下三点,而这三点正好是SQL语句的常用操作:

  1. 可以快速根据id定位到某个元素;
  2. 支持快速查找某个元素所在的某个范围之中的所有元素;
  3. 可以支持快速查找到某个元素值前或者后的n个元素;

所以问题定义好之后,我们就开始找对应的数据结构了,第一点,我们想到Hash,但明显,Hash不支持2和3,所以我们需要妥协,选择二分查找,而二分查找可选的数据结构:平衡二叉树、跳表、红黑树、B+树;

第三点,很自然的就是想到双向链表,但链表不满足第二点;这个时候,跳表这种数据结构就比较合适了:

【图片来源网络】

【编程珠玑】查找、排序、B+树

然后对跳表加以改进一下,便有了B+树,看下图,为什么一个节点需要多个元素呢?其实原因就是因为磁盘和内存速度的差距,所以最好是一次性从磁盘加载的数据刚好是一个节点,所以节点便存元素最好了,而这个值的大小,就是缓存页的大小16K;

【图片来源网络】

【编程珠玑】查找、排序、B+树

其实还有一个值得注意的,MongoDB用的数据结构就不是B+树;而是B-树,其实很好理解,文档数据库的查找需求通常不一样,他们只需找到值就可以了,很少做范围查找;

应用:9宫格键盘 

这个例子大多数90后都熟悉,那一代的程序员估计很多人都遇到这种需求;下图是一个9宫格键盘,其中如果数据某个词,只能按0、1、2、3、4、5、6、7、8、9这十个键盘,例如fan和dan这两个英文或者拼音,都是按相同的键盘数字,这意味着,所有的单词中,他们都有自己的相同按键的小伙伴,需求:如何根据用户的按键输入,快速在上亿个记录中查找到单词名称为fan的记录呢?

【编程珠玑】查找、排序、B+树

这道题,用到的有两种,第一是排序,第二是查找,排序自然是把上亿个记录排序,查找,是用到二分查找;问题的重点是,按照什么排序?

  标识:这个词在编程珠玑第一件见,作为把具有相同按键的称之为同位词,而同位词的正序序列是唯一的,所以这这个序列就是同位词的表示;给上亿个记录都贴上标示后,我们就可以按照标识再进行一次排序,于是,一个有序的记录就出现了,假设我们用的是归并排序。后面的查找就不多说了。这个问题,到此,迎刃而解。

相关推荐