版权声明:本文为博主原创,未经博主允许不得转载。 https://blog.csdn.net/weixin_36904568/article/details/88866112
一:算法的定义
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且毎条指令表示一个或多个操作。
二:算法的特性
- 输入(可以没有)
- 输出(至少一个)
- 有穷性
- 确定性
- 可行性
三:算法的要求
- 正确性:算法至少应该具有输入、输出和加工处理无歧义性、 能正确反映问题的需求、能够得到问题的正确答案。
- 可读性:便于阅读、理解和交流。
- 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名
其妙的结果。 - 时间效率髙和存储量低
四:算法的度量方法
- 事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的髙低。
- 事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算,通过算法时间复杂度来估算算法时间效率。
五:运行时间
一个程序的运行时间,依赖于算法的好坏和问题的输入规模。
- 确定输入模型,也就是算法执行的输入参数
- 识别内循环,确定算法执行的循环次数
- 根据内循环中的操作,确定成本模型,也就是内循环的操作次数
- 对于给定的输人,计算操作的执行频率。
1:算法的时间复杂度(一般都是最坏时间复杂度)
定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T ( n)随n的变化情况,并确定T (n)的数量级。
记做:T (n) = O(f(n))
特点:一般情况下,随着n的増大,T(n)増长最慢的算法为最优算法。
推导:
- 计算最坏情况下的操作数。如果算法需要操作n次,每次需要进行m个操作,则算法的速度为O(n*m)
- 用常数1取代运行时间中的所有加法常数。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且不是1,则去掉与这个项相乘的常数。 在比较算法时,如果两种算法的大O运行时间不同,则大O里的常量无关紧要。
常见:
- 常数阶 O(1):与问题的大小无关(n的多少),执行时间恒定(普通语句)
- 对数阶 O(logn):循环体中的代码执行2n次(二分策略)
- 线性阶 O(n):循环体中的代码执行常数次(单层循环)
- 线性对数阶 O(nlogn):循环体中的代码执行nlogn次(分治)
- 平方阶 O(n2):嵌套两层循环的代码(双层循环)
立方阶O(n3):嵌套三层循环的代码(三层循环)- 指数阶 O(2n):循环体中的代码需要执行2n次(枚举查找)
阶层阶O(n!):嵌套循环的代码需要执行n!次的算法。
比较:
O(1 )< O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n )<O(n!)< O(nn)
2:算法的空间复杂度
定义:算法的空间复杂度通过计算算法所需的存储空间实现。一般情况下,一个程序在机器上执行时,除了需要存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。
记做:S(n)= O(f(n))