我说过,面临海量数据的时候,了解这个概念依然很重要 。如果这一次算法需要处理 1,000,000 条元素(这对数据库来说也不算大) 。
- O(1) 算法会消耗 1 次运算
- O(log(n)) 算法会消耗 14 次运算
- O(n) 算法会消耗 1,000,000 次运算
- O(n*log(n)) 算法会消耗 14,000,000 次运算
- O(n^2) 算法会消耗 1,000,000,000,000 次运算
继续深入
为了让你能明白
- 搜索一个好的哈希表会得到 O(1) 复杂度搜索一个均衡的树会得到 O(log(n)) 复杂度搜索一个阵列会得到 O(n) 复杂度最好的排序算法具有 O(n*log(n)) 复杂度糟糕的排序算法具有 O(n^2) 复杂度
有多种类型的时间复杂度
- 一般情况场景
- 最佳情况场景
- 最差情况场景
这里我只探讨时间复杂度,但复杂度还包括:
- 算法的内存消耗
- 算法的磁盘 I/O 消耗
- n^4:差劲!我将要提到的一些算法具备这种复杂度 。
- 3^n:更差劲!本文中间部分研究的一些算法中有一个具备这种复杂度(而且在很多数据库中还真的使用了) 。
- 阶乘 n:你永远得不到结果,即便在少量数据的情况下 。
- n^n:如果你发展到这种复杂度了,那你应该问问自己IT是不是你的菜 。
合并排序当你要对一个集合排序时你怎么做?什么?调用 sort() 函数……好吧,算你对了……但是对于数据库,你需要理解这个 sort() 函数的工作原理 。
优秀的排序算法有好几个,我侧重于最重要的一种:合并排序 。你现在可能还不了解数据排序有什么用,但看完查询优化部分后你就会知道了 。再者,合并排序有助于我们以后理解数据库常见的联接操作,即合并联接。
合并
与很多有用的算法类似,合并排序基于这样一个技巧:将 2 个大小为 N/2 的已排序序列合并为一个 N 元素已排序序列仅需要 N 次操作 。这个方法叫做合并 。
我们用个简单的例子来看看这是什么意思:
文章插图
通过此图你可以看到,在 2 个 4元素序列里你只需要迭代一次,就能构建最终的8元素已排序序列,因为两个4元素序列已经排好序了:
- 1) 在两个序列中,比较当前元素(当前=头一次出现的第一个)
- 2) 然后取出最小的元素放进8元素序列中
- 3) 找到(两个)序列的下一个元素,(比较后)取出最小的
- 重复1、2、3步骤,直到其中一个序列中的最后一个元素
- 然后取出另一个序列剩余的元素放入8元素序列中 。
文章插图
既然我们明白了这个技巧,下面就是我的合并排序伪代码 。
C
文章插图
合并排序是把问题拆分为小问题,通过解决小问题来解决最初的问题(注:这种算法叫分治法,即『分而治之、各个击破』) 。如果你不懂,不用担心,我第一次接触时也不懂 。如果能帮助你理解的话,我认为这个算法是个两步算法:
- 拆分阶段,将序列分为更小的序列
- 排序阶段,把小的序列合在一起(使用合并算法)来构成更大的序列
推荐阅读
- 如何挑选黑豆
- 不是夫妻合租房犯罪吗
- 医保断缴三个月余额清零?员工可自愿放弃社保?这些谣言别再信了
- 手串颗数大有讲究,千万别戴错了
- “禁止长时间停车”,到底指的是几分钟?交警:最后再说一遍
- 太热了!别再披头散发了,这4款发型够美够清凉
- 没钱还信用卡有什么解决办法
- 信用卡过期卡怎么处理
- 信用卡逾期被注销怎么还钱
- 如何找回抖音私聊记录