数据结构与算法学习(1)——代码效率优化

作为一名电子信息工程专业的学生,我们学校是在专业选修开设了数据结构课,但是大家都没有选择这一门课,由于一个偶然的机会,在一个技术交流群里有大牛推荐了这个数据结构课,只要1块钱还是9.9块钱我不记得了,反正属于薅羊毛性质,既然买了就拿来督促一下自己,也提升一下自己的代码思想。

复杂度

复杂度是衡量代码运行效率的重要因素,它包括:
时间复杂度(与代码的结构设计相关)
空间复杂度(与数据结构的选择相关)

复杂度是一个关于输入数据量 n 的函数。假设你的代码复杂度是 f(n),那么就用个大写字母 O 和括号,把 f(n) 括起来就可以了,即 O(f(n))

复杂度计算原则

  1. 复杂度与具体的常系数无关,例如 O(n) 和 O(2n) 表示的是同样的复杂度,即O(2n) 等于 O(n+n),也等于 O(n) +
    O(n)
  2. 多项式级的复杂度相加的时候,选择高者作为结果,例如 O(n²)+O(n) 和 O(n²) 表示的是同样的复杂度
  3. O(1) 也是表示一个特殊复杂度,与输入数据量 n 无关

经验性结论:

  1. 一个顺序结构的代码,时间复杂度是 O(1)
  2. 二分查找,或者更通用地说是采用分而治之的二分策略,时间复杂度都是 O(log n)
  3. 一个简单的 for 循环,时间复杂度是 O(n)
  4. 两个顺序执行的 for 循环,时间复杂度是 O(n)+O(n)=O(2n),其实也是 O(n) 两个嵌套的 for 循环,时间复杂度是
    O(n²)

牺牲空间复杂度来降低时间复杂度

代码效率的瓶颈可能发生在时间或者空间两个方面。如果是缺少计算空间,花钱买服务器就可以了。这是个花钱就能解决的问题。相反,如果是缺少计算时间,只能投入宝贵的人生去跑程序。即使你有再多的钱、再多的服务器,也是毫无用处。相比于空间复杂度,时间复杂度的降低就显得更加重要了

降低复杂度的方法

  1. 第一步,暴力解法。在没有任何时间、空间约束下,完成代码任务的开发
  2. 第二步,无效操作处理。将代码中的无效计算、无效存储剔除,降低时间或空间复杂度
  3. 第三步,时空转换。设计合理数据结构,完成时间复杂度向空间复杂度的转移
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章