iT邦幫忙

0

Ruby、演算法學習心得(一) 二元搜尋法 Binary Search。

鐵人賽結束後一陣空虛??
文章內容都會以Ruby來撰寫程式碼,然後繼續來傳教K-POP啦!

有請韓國國民妹妹IU來獻唱第一首!

Yes

轉載於:Jaxirius個人YouTube


何為演算法?

簡單一點說,把一些我們想解決的算術問題,設計出一套公式,寫成程式讓電腦運作,這些公式就是演算法。

學了演算法就會寫程式?

那當然一定是兩回事,不過學演算法可以幫助自己了解一些邏輯概念,看多了或許就會懂別人為何設計出那樣的程式,以及運用的邏輯為何,一定程度上能幫助自己對程式語言的瞭解。

演算法與特殊語法的差異。

演算法是為了加速問題解決的時間,或減少電腦解決問題所需花的記憶體。

程式語言都有自己的函式庫或特殊語法,能讓學習者用最少的時間,寫出最簡短精要的code,例如我是學Ruby的,是程式語言中黑魔法(特殊語法)數一數二多的,那些特殊語法用起來非常便利,但不一定是針對自己想解決的問題而設計。

兩者最大的差異就在特殊語法給予工程師便捷,而演算法目的在減少所耗資源。


二元搜尋法 Binary Search

二元搜尋有個使用限制,使用時資料是需經過排序的。

舉例一個最常被用來說明的例子,猜數字。

假設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次就可得到答案,這便是使用演算法的好處!


其實考慮過,像我這樣的非本科生初期就開始看演算法,似乎對找工作沒什麼幫助,不過就當成一種興趣吧,不然非本科生對於這一塊真的是很薄弱。文章分享當然就不會像鐵人賽一樣每天都會更新。
反正只是初級文章,也不重要啦,哈哈


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言