读《趣学算法》:重开算法之门,时间复杂度与空间复杂度

简介: 本文是作者阅读《趣学算法》后的笔记,介绍了算法复杂度的基本概念,包括时间复杂度和空间复杂度的不同阶表示,并通过具体例子展示了如何计算和理解算法的效率。

一、前言

程序 = 数据结构 + 算法

  • 时过境迁,自己早已把算法的基础忘记得干干净净,最近看到CSDN发起了《趣学算法》的14天阅读挑战赛,兴趣再次油然而起,既然想学,就不用那么计较,马上就开始!

二、算法复杂度

作为一名从事代码工作的程序员,在设计和优化算法时,首先就会关注到算法的复杂度。算法的复杂度,又分为时间复杂度和空间复杂度。

2.1 复杂度的表示

(1)常数阶: O(1)
  • 这应该是程序员追求的复杂度,随着n的增长,复杂度却是常数,例如1,10, 20。通常用 O(1)表示。
(2)多项式阶:O($n$)、O($ n^{2} $)、O( $ n^{3} $)
  • 就像我们日常学习的函数多项式,其特点是指数部分为常数,通常用:O( $ n $)、O( $ n^{2} $)、O( $ n^{3} $)来表示,也就是多项式的最高高阶的项。
(3)指数阶:O( $ 2^{n} $)、O( $ n^{n} $)、O( $ n! $)
  • 算法效率极差,其复杂度随n呈现指数增长。通常用O( $ 2^{n} $)、O( $ n^{n} $)、O( $ n! $)表示
(4)对数阶:O( $ \log(n) $)、O( $ n\log(n) $)
  • 算法效率较高,通常用O( $ \log(n) $)、O( $ n\log(n) $)表示

算法执行效率, O(1) 最高, 而O( $ n^{n} $) 最低,依次如下:
O(1) > O( $ \log(n) $) > O( $ n $) > O( $ n\log(n) $) > O( $ n^{2} $) > O( $ n^{3} $) > O( $ 2^{n} $) > O( $ n! $) > O( $ n^{n} $)

2.2 时间复杂度

  • 时间复杂度, 即算法运行所需的时间。

例子:实现算法,计算1到n之间所有整数的和,并计算其时间复杂度。

2.2.1 青铜:O( $ n $)
int SumFun(int n)
{
   
   
    int sum = 0;  // 计算 1 次
    int i=1; //计算1次
    for( ; i<=n; ) //计算n次
    {
   
   
       sum += i; //计算n次
       i++;  //计算n次
    }
    return sum; //计算1次
}

即,计算运行时间为:T( $ n $) = 1+1+n+n+n+1= 3n+3 ,所以,其算法复杂度可表示为O( $ n $)。

2.2.2 王者:O( $ 1 $)
int SumFun(int n)
{
   
   
     int sum = 0;  // 计算 1 次
     sum =  (1+n) * n / 2; //加1次赋值,姑且就算4次
     return sum; //计算1次
}

举例:

(1)当n=5时,
$ \underbrace{1+2+3+4+5}_{15} $

(2)当n=6时,
$ \underbrace{1+2+3+4+5+6}_{21} $

即,计算运行时间为:T( $ n $) = 1+4+1=6次 ,所以,其算法复杂度可表示为O( $ 1 $)。

备注:计算复杂度时,一般可舍弃不重要的部分,只关心n的最高阶的项

2.3 空间复杂度

空间复杂度, 即算法运行所需的内存空间。

2.3.1 例子:空间复杂度 O( $ 1 $)
int SumFun(int n)   //参数入栈,占用空间 1 个 int
{
   
   
    int sum = 0;  //局部变量,占用空间 1 个 int
    int i=1;     //局部变量,占用空间 1 个 int
    for( ; i<=n; )
    {
   
   
       sum += i; 
       i++;  
    }
    return sum;
}

即,计算运行时间为:T( $ n $) = 1+1+1= 3 ,所以,其算法复杂度可表示为O( $ 1 $)。

2.3.2 例子:空间复杂度 O( $ n $)
  • 下面以一个递归函数举例

n为正整数,试求n的阶乘,即 f(n) = n! = n*(n-1)*(n-2) … *2 * 1

int fac( int n)
{
   
   
    if((n==0)  || (n==1))
        return 1;
    else
       return n * fac(n-1);
}

假设 n=3, 即计算 3! = 3x2x1

  1. fac(3) = 3 x fac(2) = 3x2xfac(1) = 3x2x1 = 6

在这里插入图片描述

分析:如上图所示,每次递归,都要占用1个栈空间,当n=3时,就占用3个,所以可以估算出其空间复杂度为 O(n)

三、结束语

读完第一章,根据个人理解,做了小小的读书笔记,如有错误,麻烦指正~

四、课后问题

  • 谁能帮忙解答一下~
  • 请问:1.下图中 f( $ n $) 是指 f( $ n $)= $ n^2 $吗?Cf( $ n $) ==2f( $ n $) ?
  • 请问:2.下图中的 $ n_0 $​是如何计算的? 当T(n) ≤Cf(n)时, $ n_0 $​是不是该等于 -1?-_-||
  • 在这里插入图片描述
相关文章
|
1月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
62 6
|
1月前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
1月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
26 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
1月前
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
67 0
算法的时间复杂度和空间复杂度
|
1月前
|
机器学习/深度学习 存储 算法
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
|
2月前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
40 4
|
2月前
|
缓存 算法 数据处理
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
在Python算法中,时间与空间复杂度的平衡至关重要。时间复杂度反映算法执行时间随输入规模的变化趋势,空间复杂度则关注额外存储空间的需求。优秀的算法需兼顾两者,如线性搜索时间复杂度为O(n),空间复杂度为O(1);二分查找在时间效率上显著提升至O(log n),空间复杂度保持为O(1);动态规划通过牺牲O(n)空间换取O(n)时间内的高效计算。实际应用中,需根据具体需求权衡,如实时数据处理重视时间效率,而嵌入式系统更关注空间节约。通过不断优化,我们能在Python中找到最佳平衡点,实现高性能程序。
67 3
|
1月前
|
算法 C语言
深入理解算法效率:时间复杂度与空间复杂度
深入理解算法效率:时间复杂度与空间复杂度
|
3月前
|
存储 算法
读《趣学算法》:重开算法之门,神奇的兔子数列(斐波那契数列)
本文通过《趣学算法》中的斐波那契数列问题,探讨了算法的递归实现、时间复杂度分析,并展示了如何通过迭代和优化存储空间来改进算法,最终将时间复杂度从指数级降低到线性级,并将空间复杂度从线性级降低到常数级。
85 0
读《趣学算法》:重开算法之门,神奇的兔子数列(斐波那契数列)
|
26天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。