算法执行时间的估算方法
事后分析估算方法:
把算法执行若干次,通过计算机的计时功能计时,对不同的程序运行时间进行比较,从而确定算法效率。
缺陷:必须先根据算法实现测试程序,并且不同的测试环境可能导致测试结果差异很大
事前分析估算方法:
程序在计算机上运行所消耗的时间取决于:
- 算法采用的策略和方案;
- 编译产生的代码质量;
- 问题的输入规模(即输入量的多少);
- 机器执行指令的速度;
由此可见,除开与计算机硬件、软件有关的因素,一个程序的运行时间依赖于算法的好坏的和问题的输入规模。如果算法固定,那么该算法的执行时间就只和问题的输入规模有关系。
算法时间复杂度
大O记法:
算法的时间复杂度,就是算法的时间量度,记作T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度,其中f(n)是关于问题输入规模的函数。
一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。
常用时间复杂度
- O(1) – 常量时间:给定一个大小为n的输入,该算法只需要一步就可以完成任务。
const arr:number[] = [1,2,3,4,5];
const searchByIndex = (index) => {
return arr[index]; // 根据下标查询数组项,只需1步就可以完成。
}
searchByIndex(2); // 3
- O(logn) – 对数时间:给定大小为n的输入,该算法每执行一步,它完成任务所需要的步骤数目会以一定的因子减少。
let i = 1;
const stopFlag = 100;
while(i < stopFlag){
i = i * 2;
}
- O(n) – 线性时间:给定大小为n的输入,随着n的增大,对应计算次数随线性增长。
const sum = (n) => {
let sum = 0;
for(let i = 0; i <= n; i++){
sum += i
}
return sum
}
sum(100); // 5050
- O(n^2) – 平方时间:一般嵌套循环属于这种时间复杂度。
const sum = (n) => {
let sum = 0;
for(let i = 0; i <= n; i++){
for(let j = 0; j <= n; j++){
sum += i
}
}
return sum
}
console.log(sum(100)); // 510050
- O(2^n) – 指数时间:指数复杂度通常出现在这种情况,你对数据了解甚少,但是你必须尝试其所有的排列或者组合。
时间复杂度排序:O(1) < O(logn) < O(n) < O(n^ 2) < O(2^n)
空间复杂度
空间复杂度记作:S(n)=O(f(n)),其中n为输入规模,f(n)为算法关于n所占存储空间的函数。
一般情况下说复杂度,默认为算法的时间复杂度。
推荐阅读:
大O,提供了常用的算法时间复杂度,并以图表形式呈现。
2250

被折叠的 条评论
为什么被折叠?



