【Day 03】如何评估演算法的效率? Big O 与时间复杂度

一、如何判断演算法的效能 ?

当同样的问题,可以用不一样的演算法来解决时,要如何判断哪个演算法比较好 ?
可以使用以下两个评量指标:

  • 花的时间少,所需步骤少 ( 时间复杂度 )
  • 运算时占用的记忆体空间少 ( 空间复杂度 )

当然花的时间越少、用的记忆体越少,就是更好的演算法,而我们在讨论演算法的执行时间 ( Runtime ) 时,会使用大 O 符号 ( Big O Notation ) 来表示演算法的速度。

二、演算法的执行时间与增长率

我们先透过一个情境,来了解不同演算法之间的执行时间,如何依不同的速率增长。


今天 Elaine 正在为 NASA 写一个搜寻演算法,会在火箭快登入月球前起动,协助计算着陆地点。
Elaine 正思考要如何从简易搜寻法跟二进位搜寻法之间做出正确的决定,这次任务的演算法要快且精准,要在 10 秒内确认着陆地点,否则火箭将偏离轨道或失事:

  • 二进位搜寻法比较快
  • 但简易搜寻法比较容易撰写,不会出错

谨慎的 Elaine 决定用一份有 100 个元素的清单作测试,假设查一个项目耗时一毫秒:

  • 简易搜寻法:需耗费 100 毫秒
  • 二进位搜寻法:需耗费 7 毫秒 ( log 100 )

Elaine 根据这次的测试结果,发现二进位搜寻法比简易搜寻法快 15 倍。而正式清单会有 10 亿个元素,二进位搜寻法大约耗费 30 毫秒,如此推算,简易搜寻法大约会耗费 30 x 15 也就是 450 毫秒,在 10 秒内的安全范围。

因此,Elaine 决定采用简易搜寻法作位此次任务的演算法。但这个选择正确吗 ?

简易搜寻和二进位搜寻的执行时间,并非以相同速率成长 !

用简易搜寻法搜寻 10 亿个元素,是需要花费 10 亿毫秒的 ! 当搜寻次数增加时,简易搜寻相较二进位搜寻的执行时间是大幅增加的。

三、Big O 的意义

Big O Notation 可以指出演算法的快慢,让我们了解执行时间随处理资料的大小所增长的幅度。举例来说:

假设清单大小为 n。使用简易搜寻法查找每个元素,必须操作 n 次,它的执行时间就是 O(n)

不是以秒数表达速度,而是比较操作步骤次数,代表的意涵是演算法的增长幅度。

而且 Big O 是建立在最坏情况的执行时间。以 O(n) 来说,代表的就是,简易搜寻法的执行时间,永远不会比 O(n) 慢。

四、常见的 Big O 执行时间

  • O(1):输入 n ,执行步骤 1
  • O(log n):输入 n 时,执行步骤是 log n。例如:二进位搜寻
  • O(n):执行时间随着 n 线性增长。例如:简易搜寻
  • O(n^2):通常这样效能较比较差了。例如:选择排序法、两层 for 回圈

原文连结:如何评估演算法的效率? Big O 与时间复杂度 - Ted's Point 泰德观点


<<:  30天学会 Python: Day 2-input啦!

>>:  AE霓虹灯练习2-Day17

[iT铁人赛Day20]JAVA学习心得

做完了这几天的JAVA分享。。。我说是分享啦,因为我没有厉害到可以教别人 恩,所以做完分享之後,我也...

DAY28 学习30天的c++

if叙述 if叙述(if statement):是非结构。若条件运算式的结果为1(ture)则执行i...

以Postgresql为主,再聊聊资料库 PostgreSQL last N in-table cache 探讨

PostgreSQL last N in-table cache 探讨 前些天对悠游卡储值时,加值机...

14. 解释 Event bubbling & Event delegation

Event Bubbling 定义 Event bubbling跟操作DOM元素的事件有关,是指当子...

【Vue】引入 Vue Carousel 轮播图套件| 专案实作

背景 许多网页时常会加入轮播图的设计,用来放置活动讯息或是品牌视觉图片,传递资讯及强化品牌形象。因此...