前言

开篇,先来看看我的技术学习良性循环图,将对技术的热情提起来。

算法学习 | 加深了解算法的复杂度_时间复杂度

前面一篇对算法有了初步的了解和认知。

算法最吸引我的有三个点:

  • 在算法中,存在秩序和规则,工作中我喜欢有条不紊;
  • 算法可以帮助我解决一些问题;
  • 探索解题过程很有趣,虽然过程会有点曲折。

前一篇提到了,「好」算法,高效性和低存储性是两个标准,这两个标准应对的是算法的运行时间和存储空间。

算法的运行时间一般称之为时间复杂度。

算法的存储空间的大小一般称之为空间复杂度。

本篇从这两点出发,深入了解一下算法的复杂性。

算法复杂性

时间复杂度

渐近界

以函数f(n)为例,O(f(n))表示时间复杂度渐进上界,Ω(f(n))时间复杂度渐进下界。

渐进上界代表算法完成工作所需的最长的时间。

渐进下界代表算法完成工作所需的最佳的时间(最短时间)。

这两个值可以用来衡量算法的时间复杂度。通常用O(f(n))表示时间复杂度。

来看一个计算的例子

function funC(n) {
  let i = 1; // 运行1次
  while (i < n) {
    // 可假设运行x次
    i = i * 2; // 可假设运行x次
  }
}

假设可运行x次,当i=n时结束,由此可以得到公式:

2^x=n

则可以求得x的值为:

x=log_2n

时间复杂度渐近上界为:

O(f(n))=O(log_2n)

渐近准确界

θ(f(n))表示渐近准确界,θ会更加精确。当即接近渐近上界又接近渐近下界时就是渐近准确界。

三个边界的图形实例

算法学习 | 加深了解算法的复杂度_时间复杂度_02

空间复杂度

算法储存空间分类

算法占用的储存空间包括:

  • 算法本身:可以忽略不计(应该吧,我看大部分文章中,列等式的时候没有它)
  • 输入空间:输入数据所占的空间
  • 输出空间:算法运行之后,存储输出数据所需的空间大小
  • 辅助空间:算法执行中使用的额外空间或临时空间

当输入数据大小为N时,空间复杂度 = 辅助空间+输出空间。其中辅助空间是衡量算法空间复杂度的关键因素。

常数O(1)

算法执行中的辅助空间大小固定,不随输入数据N的大小而变化,此时算法的空间复杂度为常量,空间复杂度用O(1)表示。

let a = 1;
let b = a;
a+=1;

线性O(N)

当算法分配的空间是与N 呈线性关系的任意类型的集合(如数组等)时,空间复杂度用 O(n)表示。

let arr = new Array(n); // 数组占用的大小为n

未完待续

以前对算法的时间复杂度和空间复杂度,只是知道皮毛。认真学习之后,有了更深入的了解。

上篇文章中有五个问题,只回答了前两个,后面三个还在思考中,对于「如何实现从掌握到精通?」这个问题,已经有点眉目了,我整理整理,下篇详细聊聊。

扪心自问的问题们:

  • 学到的算法是否可以应用到工作中?
  • 学到的算法怎么应用到工作中?
  • 如何实现从掌握到精通?

推荐文章

在学习的过程中,查找了一些资料,其中有些写的比较好的文章,我列出来推荐给大家