鐵人賽結束後一陣空虛??
文章內容都會以Ruby來撰寫程式碼,然後繼續來傳教K-POP啦!
有請韓國國民妹妹IU來獻唱第一首!
簡單一點說,把一些我們想解決的算術問題,設計出一套公式,寫成程式讓電腦運作,這些公式就是演算法。
那當然一定是兩回事,不過學演算法可以幫助自己了解一些邏輯概念,看多了或許就會懂別人為何設計出那樣的程式,以及運用的邏輯為何,一定程度上能幫助自己對程式語言的瞭解。
演算法是為了加速問題解決的時間,或減少電腦解決問題所需花的記憶體。
程式語言都有自己的函式庫或特殊語法,能讓學習者用最少的時間,寫出最簡短精要的code,例如我是學Ruby的,是程式語言中黑魔法(特殊語法)數一數二多的,那些特殊語法用起來非常便利,但不一定是針對自己想解決的問題而設計。
兩者最大的差異就在特殊語法給予工程師便捷,而演算法目的在減少所耗資源。
二元搜尋有個使用限制,使用時資料是需經過排序的。
舉例一個最常被用來說明的例子,猜數字。
假設1~100中選一個數字要給對方猜,對方從1說到99要執行99次,99再不對100當然也就是答案了,所以這樣設計程式,等於需要讓電腦執行最多99次得到運算,雖然有機率一次就猜到,但那也是1/100的機率。
def guess_number(ans)
(1..100).each do |num|
return true if num == ans
puts num
end
end
puts guess_number(50) #會跑出1~49 然後傳出true
而二元搜尋法則是像這樣操作。(一樣1~100,正確答案是87。)
告訴電腦:找50! (我們一開始就去掉了一半)
電腦回答:太低。
告訴電腦:找75! (51~100再去掉了一半)
電腦回答:太低。
告訴電腦:找88! (76~100再去掉一半)
電腦回答:太高。
告訴電腦:找82! (76~88再去掉一半)
電腦回答:太低。
告訴電腦:找85! (83~88再去掉一半)
電腦回答:太低。
告訴電腦:找87! (86跟88的中間剛好是答案)
電腦回答:正確。總共找了6次,而如果是跑迴圈由1開始跑到100那最少要跑86次,這還只是1~100假設有個10萬筆的資料要找,那就是再快的電腦也會跑得很累。
將上面的邏輯換成程式碼。
def guess_number(ans)
low = 1
high = 100
guess_times = 0
while low <= high
guess = (low + high) / 2
if guess == ans
return guess_times
elsif guess > ans
high = guess - 1
guess_times += 1
puts guess
else
low = guess + 1
guess_times += 1
puts guess
end
end
end
puts guess_number(87) #得到猜過的數字及跑過幾次。
當然不是永用都6次,以最不好的運算狀況下最高會是7次,怎麼算來的?
很簡單
50 >> 25 >> 13 >> 7 >> 4 >> 2 >> 1
總共七次會是最高,當然也是運氣好一次就能解決。
那假設10萬筆會是幾次?
10萬 >> 5萬 >> 2.5萬 >> 1.25萬 >> 6250 >> 3125 >> 1563 >> 782 >> 391 >> 196 >> 98
>> 49 >> 25 >> 13 >> 7 >> 4 >> 2 >> 1
18次就可得到答案,這便是使用演算法的好處!
其實考慮過,像我這樣的非本科生初期就開始看演算法,似乎對找工作沒什麼幫助,不過就當成一種興趣吧,不然非本科生對於這一塊真的是很薄弱。文章分享當然就不會像鐵人賽一樣每天都會更新。反正只是初級文章,也不重要啦,哈哈