上一回讲到两种搜寻演算法,一种是一个一个找,一种则是每次寻找都可以去掉一半的选项,好像有一种是明显比较快的做法,可是我们要怎麽表达这样的差异呢?
一般在选择演算法时,我们会倾向用比较有效率的演算法,来优化时间或空间(例如记忆体)的运用,所以分析演算法时常常会讨论其执行时间(running time)[注1],也就是字面上执行一个演算法需要多少时间的意思。
通常执行时间会以演算法进行的基本操作(primitive operations)[注2]次数来衡量,并且写法上利用大O符号(big-O notation)来表达。
以线性搜寻和二分搜寻来说,上回提到,用两种方式来玩定时炸弹的话,最多分别要猜100次和7次。
所以假设输入(例如数列、阵列长度或资料数量)为n时,线性搜寻最多需要进行n次操作,可以说线性搜寻的执行时间为O(n),或称为它具有线性时间(linear time);二分搜寻最多需要log2 n次操作,因此执行时间为O(log n),亦即代表二分搜寻具有对数时间(logarithmic time)。
换句话说,大O符号表达的执行时间,是演算法在最坏情况下的执行时间,也就是花最多步骤、最慢的状态。
除了文字描述,我们还可以将这些关系用图表示:
图中x轴代表输入大小,y轴代表所需时间(以操作次数衡量),所以像图中O(n)这条线,就代表具有线性时间的演算法(如线性搜寻)在输入量变大时,它所需要的最长时间会如何增加。
这张图中包含了一些常见的演算法执行时间,右侧从上到下是最慢到最快的演算法比较,可以发现线条越陡(如O(n!)),演算法速度会越慢;线条越平(如O(log n)),则速度越快。
一路看名词解释到这边,想必心中累绩了很多疑问:
後续的文章会接着讨论这些问题。
>>: [CSS] Flex/Grid Layout Modules, part 11
某人可能会迟到,但从不缺席 (没x 失踪很久了好吗== 故事原点 在正式参加铁人赛之前,我从不知道...
音阶记忆游戏 教学原文参考:音阶记忆游戏 这篇文章会介绍,使用 Scratch 3 里的音乐扩充功能...
嗨!今天的主题是加 analytics 到网站 (专案) 里~ 讲到 analytics,大家通常会...
DAY19 用 Azure Machine Learning SDK 建立 Datastore 我们...
今天大概会聊到的范围 Animation 上一次有聊到,我们可以透过 Gesture 和 Stat...