数据结构(02)——算法和算法评价(时间和空间复杂度)

Hi!探索者们😉,欢迎踏入 408 数据结构的奇妙秘境🌿!​

我是 ankleless📚,和你并肩的寻宝人~ 这是我的探险手札🗺️,里面记着链表森林的岔路陷阱🕸️、栈与队列城堡的机关密码🔐、二叉树山脉的攀登技巧🚶‍♀️,还有哈希表迷宫的快捷密道🌀,盼着能帮你避开数据结构的暗礁险滩🌊。​

愿我们在算法峡谷🌄各自披荆斩棘,在复杂度峰顶🥇击掌相庆,共观数据流转的星河璀璨🌠!冲呀!🚀

1. 算法的基本概念

算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。另外,一个算法还应该具有下列五个重要特性

.1 有穷性

一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成

.2 确定性

算法中的每条指令必须有确切的含义,对于相同的输入只能得到相同的输出

.3 可行性

算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现,每一步操作都必须是可执行的、具体的、可实现的

.4 输入

一个算法有零个或者多个,这些输入取自于某个特定对象的集合

.5 输出

一个算法有一个或者多个输出,这些输出是与输入有着某种特定关系的量。通常,设计一个“好”的算法应考虑达到以下目标:

正确性:算法应能够正确在解决求解问题;

可读性:算法应具有良好的可读性,以帮助人们理解;

(如使用枚举让代码逻辑更清晰易懂)

健壮性:算法能对输入的非法数据做出反应或处理,而不会产生莫名其妙的输出;

(如函数传指针时,在指针前加上const)

高效率和低存储需求:效率是指算法执行的时间,存储量需求是指算法执行过程中需要的最大存储空间,这两者都与问题的规模有关。

(涉及到时间复杂度和空间复杂度)

2. 算法效率的度量

2.1 时间复杂度

一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级,算法中基本运算(最深层循环中的语句)的频度与T(n)同数量级,因此通常将算法中基本运算的执行次数的数量级操作作为该算法的时间复杂度。于是,算法的时间复杂度记为

T(n) = O(f(n))

式中,O的含义是T(n)的数量级,其严格的数学定义是:若T(n)和f(n)是定义在正整数集合上的两个函数,则存在正常数C和n1,使得当n>=n1时,都满足0<=T(n)<=Cf(n)。

算法的时间复杂度不仅依赖于问题的规模n,也取决于待输入数据的性质(如输入数据元素的初始状态)。例如在给定长度为n的数组中,查找对应元素值为k的算法大致如下:

 for (int i = 0; i < n; i++)
 {
     if (arr[i] == k)
         return i;
 }

该算法中,for语句程序块的频度不仅和问题规模n有关,而且和下列因素有关系:

若arr数组中没有和k相等的元素,则程序块的频度f(n)=n;

若arr数组中的第一个元素等于k,则程序块的频度f(n)=1;

最坏时间复杂度是指在最坏情况下,算法的时间复杂度。

平均时间复杂度是指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。

最好时间复杂度是指在最好情况下,算法的时间复杂度。

一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。

在分析一个程序的时间复杂度时,有以下两条规则:

1)加法规则:\(T(n) = T_1(n) + T_2(n) = O(f(n)) + O(g(n)) = O(\max(f(n), g(n)))\)
2)乘法规则:\(T(n) = T_1(n) \times T_2(n) = O(f(n)) \times O(g(n)) = O(f(n) \times g(n))\)

例如,设 \(\text{a}\{\}\)、\(\text{b}\{\}\)、\(\text{c}\{\}\) 三个语句块的时间复杂度分别为 \(O(1)\)、\(O(n)\)、\(O(n^2)\),则

a{
    b{}
    c{}
}   //时间复杂度为 O(n^2),满足加法规则
 a{
        b{
            c{}
        }
    }   //时间复杂度为 O(n^3),满足乘法规则

常见的渐近时间复杂度为
\(O(1) \lt O(\log_2 n) \lt O(n) \lt O(n\log_2 n) \lt O(n^2) \lt O(n^3) \lt O(2^n) \lt O(n!) \lt O(n^n)\)

2.2 空间复杂度

算法的空间复杂度 \(S(n)\) 定义为该算法所需的存储空间,它是问题规模 n 的函数,记为\(S(n) = O(g(n))\)
一个程序在执行时除需要存储空间来存放本身所用的指令常数变量输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输入数据所占空间只取决于问题本身,和算法无关,则只需分析除输入和程序之外的额外空间。例如,若算法中新建了几个与输入数据规模 n 相同的辅助数组,则空间复杂度为 \(O(n)\)。
算法原地工作是指算法所需的辅助空间为常量,即 \(O(1)\)。

空间复杂度和算法程序块递归的深度有关

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ankleless

打赏就位,创作火力全开~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值