算法分析

问题描述:在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: 常数。具体看运行机器,可以理解为执行每条语句的耗时
增长函数:语句运行的次数。通常为循环语句、函数调用的次数

  1. 求出增长函数:O(n^3)。因为这里有3层循环,其他语句可以忽略不计
  2. 求出运行时间,这里需要实际运行一下
        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++;
                        }
                    }
                }
            } 
        });
  1. 求出a: 1.718 / 1000^3 = 0.000000001718
  2. 得到时间计算模型: T(n) = 0.000000001718 * n^3(秒)

注意事项

  1. 如果算法中除了循环或函数调用,有较大的语句运行,也要计算进去。如 O(n) = n + 100
  2. 增长函数并非只是统计循环、函数调用。

分析内存使用情况

算法运行时所创建的数据类型的内存占用大小总和

  1. 找出算法运行时创建的数据类型:
    5个数字类型变量。因为for循环中定义的变量是局部变量,每一次循环结束都会销毁,故算一次
  2. 找出数据类型占用的内存大小,将全部相加
    假设每个数据类型占用内存为4字节,则5*4=20字节
posted @ 2019-12-19 16:56  魂之王  阅读(155)  评论(0编辑  收藏  举报