算法之时间复杂度、空间复杂度

算法执行时间的估算方法

事后分析估算方法:
把算法执行若干次,通过计算机的计时功能计时,对不同的程序运行时间进行比较,从而确定算法效率。
缺陷:必须先根据算法实现测试程序,并且不同的测试环境可能导致测试结果差异很大

事前分析估算方法:
程序在计算机上运行所消耗的时间取决于:

  1. 算法采用的策略和方案;
  2. 编译产生的代码质量;
  3. 问题的输入规模(即输入量的多少);
  4. 机器执行指令的速度;
    由此可见,除开与计算机硬件、软件有关的因素,一个程序的运行时间依赖于算法的好坏的和问题的输入规模。如果算法固定,那么该算法的执行时间就只和问题的输入规模有关系。

算法时间复杂度

大O记法:
算法的时间复杂度,就是算法的时间量度,记作T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度,其中f(n)是关于问题输入规模的函数。
一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。

常用时间复杂度

  1. O(1) – 常量时间:给定一个大小为n的输入,该算法只需要一步就可以完成任务。
const arr:number[] = [1,2,3,4,5];
const searchByIndex = (index) => {
  return arr[index];  // 根据下标查询数组项,只需1步就可以完成。
}
searchByIndex(2); 	// 3
  1. O(logn) – 对数时间:给定大小为n的输入,该算法每执行一步,它完成任务所需要的步骤数目会以一定的因子减少。
let i = 1; 
const stopFlag = 100; 
while(i < stopFlag){
  i = i * 2;
}
  1. O(n) – 线性时间:给定大小为n的输入,随着n的增大,对应计算次数随线性增长。
const sum = (n) => {
  let sum = 0;
  for(let i = 0; i <= n; i++){
    sum += i
  }
  return sum
}
sum(100); // 5050
  1. 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
  1. 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,提供了常用的算法时间复杂度,并以图表形式呈现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值