演算法是一组 step by step 用来解决问题、完成任务的指令,它的定义:
输入 + 演算法 = 输出
在程序中,可以使用回圈、if else 等逻辑,来定义程序的运作与流程控制,例如:
而演算法可以简单地想像为复杂版的流程控制,用更复杂的逻辑,优化迭代出更有效率的方法,来解决问题。
演算法的目的是提升时间复杂度,更有效率地控制程序流程
而在面对问题时,先别急着马上写程序,我们可以透过运算思维,先思考要如何拆解问题、整理自己的想法,再来转换成程序码表达。
接下来透过终极密码猜数字的游戏,来稍微感受一下演算法。
我们有 1 到 100 的数字 ( 有顺序性 ),你要如何用最快的方法猜到我心中设定的数字呢 ?
方法一:
按照 1、2、3、4 … 依序往下猜,每猜一次就剔除一个数字。这样地简易搜寻,其实就算一个演算法。
让我们试着用正式一点的「虚拟码」( Pseudocode ) 来表达:
set item be 90
for i (from 1 to 100) do
if guess = item then
print("Correct")
end if
end for
但是,如果我设定的数字是 90,方法一就得猜 90 次才猜的到。最坏的情况要 100 次 !
那有没有更快速的方法呢 ?
方法二:
从中间的 50 开始应该是比较好的办法,虽然比较低,但是马上剔除一半的数字。
接下来从 75 开始猜 ( 50 到 100 的中位数 ),还是太低,但我们又去除掉了一半的数字 ( 50 到 75 )
就这样从中间的位置开始猜,每次可以剔除一半的数字,最多 7 次就可以猜到了吧 !
arr is an array from 1 to 100
let low be 0
let high be arr.length-1
set item be 90
while low < high do
mid = (low+high)/2
guess = arr[mid]
if guess = item then
return mid
end if
if guess < item then
low = mid + 1
else
high = mid - 1
end if
end while
方法二这样类似的搜寻方式,就是使用二进位搜寻 ( Binary Search ) 演算法来解决问题。
如果今天数字很大很大用 n 表示的话,最坏的情况下,方法一需要 n 个步骤才能完成,但方法二只需要 log n 个步骤就好。
原文连结:认识演算法 Algorithm ( 使用 JavaScript ) - Ted's Point 泰德观点
>>: Spring Tool Suites 开发工具/设定(Day2)
另一个常见资料库分类是从「资料处理*」的应用角度来区分: 交易型Transaction: OLTP:...
要进入写测试之前呀~我们必须要先了解为什麽要写测试,及我们会说明一种测试的开发方法(TDD) 写测试...
昨天介绍完SMO算法第三步,今天就要来写这个方法第四步, 昨天我们得到aj,接下来要使用aj来更新a...
现在我们的资料库已经就绪了,我们赶快来透过 .NET Web API 操作资料库吧! 现在写 .NE...
这次开发一个之後活动可能会用到的功能叫抽签 只要输入/draw就随机抽一位公会在线上的成员 希望有了...