文章插图
在拆分阶段过程中,使用3个步骤将序列分为一元序列 。步骤数量的值是 log(N) (因为 N=8, log(N)=3) 。【译者注:底数为2,下文有说明】
我怎么知道这个的?
我是天才!一句话:数学 。道理是每一步都把原序列的长度除以2,步骤数就是你能把原序列长度除以2的次数 。这正好是对数的定义(在底数为2时) 。
排序阶段
文章插图
在排序阶段,你从一元序列开始 。在每一个步骤中,你应用多次合并操作,成本一共是 N=8 次运算 。
- 第一步,4 次合并,每次成本是 2 次运算 。
- 第二步,2 次合并,每次成本是 4 次运算 。
- 第三步,1 次合并,成本是 8 次运算 。
【这个完整的动图演示了拆分和排序的全过程,不动戳大 。】
文章插图
合并排序的强大之处
为什么这个算法如此强大?
因为:
- 你可以更改算法,以便于节省内存空间,方法是不创建新的序列而是直接修改输入序列 。
- 你可以更改算法,以便于同时使用磁盘空间和少量内存而避免巨量磁盘 I/O 。方法是只向内存中加载当前处理的部分 。在仅仅100MB的内存缓冲区内排序一个几个GB的表时,这是个很重要的技巧 。
- 你可以更改算法,以便于在 多处理器/多线程/多服务器 上运行 。
- 这个算法可以点石成金(事实如此!)
阵列,树和哈希表既然我们已经了解了时间复杂度和排序背后的理念,我必须要向你介绍3种数据结构了 。这个很重要,因为它们是现代数据库的支柱 。我还会介绍数据库索引的概念 。
阵列
二维阵列是最简单的数据结构 。一个表可以看作是个阵列,比如:
文章插图
这个二维阵列是带有行与列的表:
- 每个行代表一个主体
- 列用来描述主体的特征
- 每个列保存某一种类型对数据(整数、字符串、日期……)
树和数据库索引
二叉查找树是带有特殊属性的二叉树,每个节点的关键字必须:
- 比保存在左子树的任何键值都要大
- 比保存在右子树的任何键值都要小
概念
文章插图
这个树有 N=15 个元素 。比方说我要找208:
- 我从键值为 136 的根开始,因为 136<208,我去找节点136的右子树 。
- 398>208,所以我去找节点398的左子树
- 250>208,所以我去找节点250的左子树
- 200<208,所以我去找节点200的右子树 。但是 200 没有右子树,值不存在(因为如果存在,它会在 200 的右子树)
- 我从键值为136的根开始,因为 136>40,所以我去找节点136的左子树 。
- 80>40,所以我去找节点 80 的左子树
- 40=40,节点存在 。我抽取出节点内部行的ID(图中没有画)再去表中查找对应的 ROW ID 。
- 知道 ROW ID我就知道了数据在表中对精确位置,就可以立即获取数据 。
回到我们的问题
推荐阅读
- 如何挑选黑豆
- 不是夫妻合租房犯罪吗
- 医保断缴三个月余额清零?员工可自愿放弃社保?这些谣言别再信了
- 手串颗数大有讲究,千万别戴错了
- “禁止长时间停车”,到底指的是几分钟?交警:最后再说一遍
- 太热了!别再披头散发了,这4款发型够美够清凉
- 没钱还信用卡有什么解决办法
- 信用卡过期卡怎么处理
- 信用卡逾期被注销怎么还钱
- 如何找回抖音私聊记录