【算法与数据结构】时间复杂度和空间复杂度

最近无意间看见了一本【图解算法数据结构】,感觉很有兴趣,故边学习边做下笔记,当然也会加入一些自己的以前的学习心得,原书直通车:力扣 

0. 前言 

0.1 算法的5个重要特性

        确定性、有穷性、可行性、输入(0个或多个)、输出(1个或多个)

0.2 "好"的算法特征

        正确性、可读性、健壮性、效率和低存储量需求(时、空复杂度都尽量低)

1. 时间复杂度

1.1 概念

        时间复杂度指算法的数据规模为N时,算法运行所花费的时间。

        【注意】此处统计的时【计算操作数量】,而非算法绝对运行时间,两者呈正相关。

        【注意】所谓时间复杂度,是指最坏情况下估算算法执行时间的一个上界。

1.2 符号

        最好、最坏、平均时间复杂度均用O表示

1.3 常见种类

       ***【常<对<幂<指<阶】 O(1) < O(logN) < O(N) < O(NlogN) < O(N^{2})  < O(2^{N}) < O(N!)

常数O(1) : 运行次数不随N变化而变化

线性O(N):运行次数与N呈线性关系 

        若有两层循环,第二次循环和N无关,则与N依旧是线性关系

平方O():两层循环相互独立,都与N呈线性关系,因此总体与 N 呈平方关系

指数O()常出现于递归

阶乘O(N!): 常使用递归实现

对数O(logN):常出现于二分法、分治法算法中出现

线性对数O(NlogN):两层循环,第一层O(N),第二层O(logN),故O(NlogN)

1.4 时间复杂度计算

1.4.1 !!!递归方程

【算法与数据结构】时间复杂度和空间复杂度_第1张图片 

1.4.2 持续补充技巧 。。。

2. 空间复杂度

1.1 概念

        空间复杂度指算法数据规模为N时,算法运行所使用的【暂存空间】和【输出空间】之和。

栈帧空间:看函数调用。一般单个函数调用完后会释放空间,所以使用常数空间,空间复杂度为O(1);但在函数递归调用时,会出现累计栈帧空间的情况,需要进一步分析

【算法与数据结构】时间复杂度和空间复杂度_第2张图片

 1.2 符号

         空间复杂度统计的是 “最差情况” 下使用的空间大小,以体现算法运行所需预留的空间量,使用符号 O 表示。

【注意】算法原地工作是指执行算法需要的辅助空间为常数,即O(1)!

【注意】同一个算法,实现语言的级别越高,执行效率越低!

时空权衡

        通常情况下,算法设计中一般会采取「空间换时间」的做法,即牺牲部分计算机存储空间,来提升算法的运行速度。

以后有新的知识点,会及时补充!

你可能感兴趣的:(算法与数据结构,算法,数据结构,c语言)