一个好的算法需要正确性,可读性,健壮性,高效性。
前三个没什么需要注意的,但是说到高效性,那么
,根据实际需求,这就要求我们进行取舍了。
接下来我们看看如何对算法运行时间进行度量
第一种方法有缺点,首先受环境影响,不写完代码不能看到结果
第二种方法:一次操作的时间*总操作次数
看第一行,这里注意,for循环的每一次判断都是对for的一次执行,不一定非要判断成功了才算是他的执行
看第二行,这里由于外层的for成功判断了,n次,所以你的这个第二个for语句需要运行n*(n+1)次
第三行,这里是上面的两个for都成功判断了n次,所以是n*n次。
另一种方法,说人话就是比较一下数量级。
这叫渐进时间复杂度。
可以这么表示
但是省流:找出次数最高的一个,就可以和其他的算法的复杂度进行比较了。
贡献最大的这位称为基本操作
在这几种数据中n的选取方法
来看一下可有可无的定理,说人话就是只看最高次项
记得写法不要错哦,记得写
当然,这里有旁门左道,就是找到嵌套最深的,他的最高次就可以了
就是这个算法的渐进时间复杂度
在看一个例子
其中有几点需要注意的,首先就是求和符号的用法,从实际意义来看
就是把k从一变成j的过程中,1的所有取值求出来
当然,1是不变的,所以直接就是j
再看这个
就是把j从j变化到i的过程中所有j的值求和,所以得到i(i+1)/2
最后算这个,这个可以分开来算,否则太复杂辣
得到这么一个东东
其中有一个结论,n*n从1到n的求和就是这个n(n+1)(2n+1)
在看一个例子吧
其中呢,找出那个i的所谓的通项公式是关键
二时间复杂度的其他注意事项
通常我们会考虑最坏和平均。
还有就是
这玩意之前都说过了,芜湖
当然,还可以通过函数的样子来判断
分割线--------------------------------------------------------------------------------------
上面都是时间效率的讨论,接下来说说空间效率
概览
例子看看
其中t占用的空间就是辅助空间
占用的空间是1,称为常数阶,称为原地工作
第二个占用的显然和我们的数组的元素个数成一次函数的关系,称为一次阶