【连载】关系型数据库是如何工作的?(2) - 时间复杂度

基础知识

很早之前,开发者必须准确的计算他们编写代码的操作指令数量,他们深刻理解使用的数据结构和算法,因为那个时候CPU计算能力和内存储存空间都很小,需要最大限度的利用起来,经不起浪费。

在这一部分我会介绍一些这方面的内容,因为对于理解数据库它们确实很重要。另外,还会介绍数据库索引的概念。

时间复杂度O(1) vs O(n2)

时至今日,很多开发者都不关心时间复杂度,大部分时候也许他们是对的。但是当你需要处理海量数据或者对程序执行时间非常敏感时(毫秒级别),理解时间复杂度就变得非常重要了,而不幸的是,数据库正好同时面临以上两个问题。时间复杂度能够帮助我们理解后续要介绍的基于成本的优化机制。

理论

时间复杂度是用于表明一个算法处理指定大小的数据集合会花费多长时间。为了便于描述时间复杂度,计算机学科采用大O表示法。这种表示法用一个函数描述一个算法处理指定大小的数据集合需要多少个操作。

例如,如果一个算法的时间复杂度是 “O( some_function() )”,并且数据集合大小是“a_certain_amount_of_data”,那么这个须发处理该数据集合需要“some_function(a_certain_amount_of_data)”个操作。

实际上,时间复杂度描述的重点并不是数据集合的大小,而是随着数据集合大小的增加,相应的算法处理操作数量的变化趋势,简而言之,时间复杂度描述的是数据集合大小和操作数量之间的关系,并不能表示精确的操作数量。

这里写图片描述
上图可以看到不同时间复杂度的对比,从途中可以看到,当数据集合大小从1上升到10亿时:

  1. O(1) 操作数始终保持不变,因此其也称为常量复杂度;
  2. O(log(n)) 操作数增加很少;
  3. O(n2) 是最糟糕的复杂度,因为其操作数激增;
  4. O(n)和O(log(n)*n)操作数也有一个明显的增加;

例子

实际上,在数据量较小时,O(1) and O(n2)的差异可以忽虑不计。假设数据集合大小是2 000,那么:

  1. O(1)会花费1个操作;
  2. O(log(n))会花费7个操作;
  3. O(n)会花费2000个操作;
  4. O(n*log(n))会花费14 000个操作;
  5. O(n2)会话费4 000 000个操作;

表面看来,O(1) 和 O(n2)貌似差距很大,但实际运行时,它们只有大概2ms(大概就是眨下眼睛的时间)左右的时差。这是因为现代处理器每秒可以处理数以亿计的操作,这也是对于大部分IT项目,性能和优化并不是个问题的原因。

但是当处理海量数据时,理解时间复杂度仍然很重要。假设数据集合大小是1 000 000时,那么:

  1. O(1)会花费1个操作;
  2. O(log(n))会花费14个操作;
  3. O(n)会花费1 000 000个操作;
  4. O(n*log(n))会花费14 000 000个操作;
  5. O(n2)会话费1 000 000 000 000个操作;

这样看来,O(n2) 实际耗费的时间估计够你喝杯咖啡了,如果再加一个0,也许你就可以小睡一会了。

进阶理解

一些经验数据:

  1. HASH表的搜索时间复杂度是O(1) ;
  2. 平衡树的搜索时间复杂度是O(log(n));
  3. 数组的搜索时间复杂度是O(n);
  4. 最好的排序算法的时间复杂度是O(n*log(n)) ;
  5. 最糟糕的排序算法的时间复杂度是O(n2) ;

在后续章节,会介绍这些算法和数据结构。

有许多种类型的时间复杂度:

  1. 平均场景下的时间复杂度;
  2. 最坏场景下的时间复杂度;
  3. 最好场景下的时间复杂度;

我们谈论的一般是指最坏场景下的时间复杂度。虽然我们只谈论时间复杂度,但复杂度也可以用于表示:

  1. 算法的内存消耗;
  2. 算法的磁盘IO消耗;

当然了,也有比O(n2)更糟糕的时间复杂度,例如:

  1. n的4次方:我提及的一些算法就是这个时间复杂度;
  2. 3的n次方:在后续文章我们可以看到这种时间复杂度的算法;
  3. 阶乘n:你永远不会得到结果,即使当数据量较小时;
  4. n的n次方:如果是这个复杂度,那你应该问问自己,你还是做IT的吗?快点换个行业吧,哈哈!

说明:我们并没有给出大O表示发的详细说明,仅仅阐述了其思想。如果想详细了解,则可以查看维基百科:大O表示法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值