五大特征:
- 又穷性:程序嘛,一定是要在有限的步骤之后就要停下来,不然电脑遭不住,会死机的
- 确定性:程序的每一步他都会有一个确定的结果。
- 可行性:程序的是否可行取决于当下的具体环境,比如计算机的计算能力、存储能力等。受这些条件的限制,有些算法在理论上是可以实现的,但是在现实中是没有办法完成的。
- 输入:就是我们敲进去的,电脑能够识别的一些数字,字符或者图像等等
- 输出:程序运行过程中或者结束后给我返回的信息
时间复杂度:
简单来讲,时间复杂度就是随着程序越来越复杂,执行程序的时间增长的快慢程度。在一定程度上,时间复杂度决定着这个算法的好坏。时间复杂度本质上就是一个问题规模的函数,记为T(n)
常用的时间复杂度大小关系:
复杂度的计算:
找到算法时间增长最快的那个函数项,将他的系数改为1 。实际上,时间复杂度的计算是一个关于增长率的计算,更多的是关于数量级的讨论,相对于数量级来讲,一些常数项对结果的影响是非常小的,所以我们通常都可以将常数项忽略不计。
再细分下来,关于单个循环体的时间复杂度的计算,比如java里面的for循环,这个时候我们可以忽略其他,直接关注循环体内的执行次数即可,因为循环体内的程序是对整个程序的性能影响最大的。俗话说,擒贼先擒王嘛。
多个循环体的时间复杂度计算:
如果多个循环体相互独立,那么时间复杂度就是多者之间相加,如果是相互嵌套,那么就是相乘
空间复杂度:
其实定义上都是类似的,空间复杂度就是,随着问题规模的增大。所需要的空间增长的快慢程度,比如问题规模大了,就需要更多的内存或者磁盘的空间。