目录
初识算法
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度和时间复杂度来衡量。
对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。
简单来说,算法就是解决问题的具体步骤。就像数学中一个数学题有多种解题方法一样。在程序中,一个问题也往往对应着多种算法。虽然最终都可以解决问题,但有的效率高,有的效率低。因此我们在解决问题时要考虑最优的算法。通常是:以时间换空间或以空间换时间。
最经典的方法:【大O符号表达式】
时间复杂度
执行当前算法消耗的时间
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为O(n)。
线性阶
随着数组大小的变化,查询遍历的次数呈线性增长,则时间复杂度为O(n)。
常数阶
在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1)。
指数阶
例如:冒泡排序。随着数组长度的变化,我们遍历的次数是指数级增长的。则时间复杂度为O(n^2)。
空间复杂度
执行当前算法所占用的内存空间
比较各种算法额外占用的空间。
1、如果算法执行所需要的临时空间不随着某个变量n的大小而变化,则程序的空间复杂度用 O(1) 表示。
2、如果随着输入值 n 的增大,程序申请的存储空间成线性增长,则程序的空间复杂度用 O(n) 表示。
3、如果随着输入值 n 的增大,程序申请的存储空间成 n^2关系增长,则程序的空间复杂度用 O(n^2) 表示。
4、如果随着输入值 n 的增大,程序申请的存储空间成 n^3 关系增长,则程序的空间复杂度用 O(n^3) 表示。