如何衡量算法好坏

如何衡量算法好坏

事后统计法:直接跑数据测试

  • 优点:一目了然
  • 缺点:依赖测试数据;比较依赖于硬件环境

事前分析法:

1.最差的执行情况
2.假设每行语句执行时间一样
3.计算出算法完成所需要的步骤数量

时间复杂度:

用来衡量一个算法的执行,随数据规模增大,而增长的时间成本

  • 不依赖于环境因素

如何表示时间复杂度

  • 假设要处理的数据规模是n,代码总的执行行数用函数f(n)来表示
  • 为了对f(n)进行化简,找到一个变化趋势与之相近的表示法

大O表示法

  • c c c, c 1 c1 c1, c 2 c2 c2 都为一个常数
  • f ( n ) f(n) f(n)是实际执行代码行数与n的函数
  • g ( n ) g(n) g(n)是经过化简,变化趋势与 f ( n ) f(n) f(n) 一致的 n n n的函数

已知f(n)来说,求g(n)

  • 表达式中相乘的常量,可以省略
  • 多项式中数量规模更小(低次项)的表达式
  • 不同底数的对数,渐进上界可以用一个对数的 l o g n log_n logn表示
  • 类似的,对数的常数次幂可省略

常见大O表示法:

按时间复杂度从低到高:

  • O ( 1 ) O(1) O1,常量时间,意味着算法时间不随数据规模而变化
  • o ( l o g ( n ) ) o(log_(n)) o(log(n)),对数时间
  • o ( n ) o(n) o(n),线性时间,算法时间与数据规模成正比
  • o ( n ∗ l o g ( n ) ) o(n*log(n)) o(nlog(n)),拟线性时间
  • o ( n 2 ) o(n^2) o(n2)指数时间
  • 0 ( n ! ) 0(n!) 0(n!)阶乘

asymptotic upper bound

渐进上界:从某个常数 n 0 n0 n0开始, c ∗ g ( n ) c*g(n) cg(n)总是位于 f ( n ) f(n) f(n)上方,那么记作 o ( g ( n ) ) o(g(n)) o(g(n))

asymptotic lower bound

渐进下界:从某个常数 n 0 n0 n0开始, c ∗ g ( n ) c*g(n) cg(n)总是位于 f ( n ) f(n) f(n)下方,那么记作 o m i g a ( g ( n ) ) omiga(g(n)) omiga(g(n))

asymptotic tihgt bounds

渐进紧界:从某个常数 n 0 n0 n0开始, f ( n ) f(n) f(n)总是在 c 1 ∗ g ( n ) c1*g(n) c1g(n) c 2 ∗ g ( n ) c2*g(n) c2g(n)之间,记作 z i t a ( g ( n ) ) zita(g(n)) zita(g(n))

空间复杂度

与时间复杂度类似,一般也使用大 o o o表示法来衡量:一个算法执行随数据规模增大,而增长的额外空间成本。

例如:如果需要常数个指针,那么额外占用的空间是 o ( 1 ) o(1) o(1)

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值