算法是什么?
算法(algorithm) 是对特定问题求解步骤的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。
列举算法还具有哪些特性,并解释
算法还具有以下5个重要特性
-
有穷性
一个算法必须总是在执行有穷步之后结束,且每一步在有穷时间内完成(输入值合法)
-
确定性
算法中任一条指令都不能产生二义性。且,在任何条件下,算法只有惟一的一条执行路径,即相同的输入只能得到相同的输出。
-
可行性(核心)
一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
-
输入
一个算法有零或多个的输入,这些输入取自于某个特定的对象的集合
-
输出
一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量
怎么才能算做一个“好”的算法?
算法设计的要求
-
正确性(correctness)
算法应当满足具体问题的需求。
-
可读性(readability)
算法主要是为了人的阅读与交流,其次才是机器执行。可读性好,有助于人对算法的理解,否则可能会隐藏较多错误,难以调试和修改
(即要有详细注释)
-
健壮性(robustness)
当输入数据非法时,算法也能适当地做出反应或进行处理,而不是产生莫名其妙的输出结果。
-
效率与低存储量需求
效率指算法执行所需时间越少,其效率越高。
存储量指算法执行所需最大存储空间。
聊聊 如何度量算法的效率
算法执行时间需提供依据该算法编制的程序在计算机上运行时所消耗的时间来度量。而度量方式分为两种。
-
事后统计方法
通过计算机中的计时,通过一组或多组相同统计数据进行分辨,得出不同算法的优劣。但这种方法有缺陷,一是必须先要运行算法编制的程序,二是所得的时间依赖于计算机的配置,算法的优劣容易被掩盖。
-
事前分析估计方法
一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于以下因素:
-
算法选择的策略
-
问题的规模 (比如说问题的范围)
-
书写程序的语言,算法相同,实现语言的级别越高,执行效率越低。即语言的级别和执行效率成反比。
-
编译程序所产生的机器代码的质量。
-
机器执行指令的速度
因为不同的计算机配置不同,因此使用绝对的时间单位衡量算法的效率是不合适的,因此要撇开与计算机硬件、软件有关的因素。
由此引出 时间复杂度与空间复杂度
-
时间复杂度是什么?
时间复杂度是算法中所有语句的频度之和的数量级,也是算法中基本运算的频度的数量级。
(频度指该语句重复执行的次数)
详细:
一个算法由控制结构(顺序、分支、循环) 和原操作(固有的一些数据类型的操作,例如赋值、比较) 构成的,算法时间取决于二者的综合效果。
一般情况下,算法中基本操作重复执行的次数是问题规模 n 的某个函数 f(n) ,算法的时间度量记作
T(n) = O(f(n))
它表示随问题规模 n的增大,算法执行时间的增长率和 f(n) 的增长率相同,称做算法的渐近时间复杂度,简称时间复杂度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QFhnLcHc-1675240459143)(C:\Users\Asus\Desktop\MarkDown\数据结构\图片\14.jpg)]
O(1),又称为常数阶
O(log n)
int m=1;
while(m<n){
m *=2;
}
假如这段代码 m *= 2 执行 x 次
那么 2^x = n ---> x=log n
O(n^2)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
这段代码,需要外循环n次,内循环n次,总次数是 n*n=n^2
空间复杂度是什么?
空间复杂度作为算法所需存储空间的度量。记作
S(n) = O(f(n))
n为问题的规模。
执行一个程序,除了需要存储空间来寄存本身所用的指令、常数、变量、输入数据外,也需要一些对数据进行操作的工作单元和存储一些为了实现计算所需信息的辅助空间 (即在运行过程中,执行这些代码后可能会产生一些操作和一些信息,这些也需要存储空间)。
空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度。
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大o渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
什么是原地工作?
原地工作指算法所需的辅助空间为常量