算法分析
问题描述:在1000个数内,找出3个相加和为506有多少个
// js
let count = 1000;
let target = 506;
let result = 0;
for(let i=1; i<=count; i++) {
for (let j=1; j<=count; j++) {
for (let k=1; k<=count; k++) {
if (i+j+k===target) {
result++;
}
}
}
}
分析运行时间
运行时间:T(n) = a * 增长函数
a: 常数。具体看运行机器,可以理解为执行每条语句的耗时
增长函数:语句运行的次数。通常为循环语句、函数调用的次数
- 求出增长函数:
O(n^3)
。因为这里有3层循环,其他语句可以忽略不计 - 求出运行时间,这里需要实际运行一下
function testRunTime(fn) {
let start = new Date();
let end = null;
fn();
end = new Date();
console.log(`运行时间: ${(end - start) / 1000}秒`); // 1.718 秒
}
testRunTime(() => {
let count = 1000;
let target = 506;
let result = 0;
for (let i = 1; i <= count; i++) {
for (let j = 1; j <= count; j++) {
for (let k = 1; k <= count; k++) {
if (i + j + k === target) {
result++;
}
}
}
}
});
- 求出a:
1.718 / 1000^3 = 0.000000001718
- 得到时间计算模型:
T(n) = 0.000000001718 * n^3
(秒)
注意事项:
- 如果算法中除了循环或函数调用,有较大的语句运行,也要计算进去。如
O(n) = n + 100
- 增长函数并非只是统计循环、函数调用。
分析内存使用情况
算法运行时所创建的数据类型的内存占用大小总和
- 找出算法运行时创建的数据类型:
5个数字类型变量
。因为for循环中定义的变量是局部变量,每一次循环结束都会销毁,故算一次 - 找出数据类型占用的内存大小,将全部相加
假设每个数据类型占用内存为4字节,则5*4=20
字节