此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰寫,因此和原課程內容有些出入。
問題描述
以陣列的方式儲存許多數值,這些數值是各個不同時間點股票的價格,例如,[32, 46, 26, 38, 40, 48, 42],我們要透過演算法:
找出在哪個時間點買進、哪個時間點賣出可以獲得最高的收益。以剛剛的陣列為例,應該在價格為 26 元時買入、48 元時賣出,這時會獲得 22 元的最高收益。
如果該天沒有獲利的可能則回傳...
2017年9月24日
[演算法] 合併排序法(Merge Sort)
此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰寫,因此和原課程內容有些出入。
問題描述
透過函式將陣列中的數值加以排序。
前置知識:Merge Sort
Merge Sort 和 Bubble Sort 一樣,都是一種用來排序的演算法。
Merge Sort 的演算法主要包含兩個部分:
1. 將陣列對半拆分
Merge Sort 的第一步是要將陣列兩兩對半拆分,直到拆到每個陣列只剩一個元素://...
[演算法] 氣泡排序法(Bubble Sort):利用兩兩元素交換位置達到排序
此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰寫,因此和原課程內容有些出入。
問題描述
以陣列的方式傳入許多數值,回傳排序好的資料:function bubbleSort (arr) {...}
Bubble Sort 的方式是從陣列的最前面開始,一次比較陣列中兩兩相鄰的元素,然後根據大小將它們調換順序,大的移到後面:
當我們比較過所有元素一次後,可以確保數值最大的元素在最後面
...
2017年9月23日
[演算法] Algorithm: Sieve of Eratosthenes 質數判斷
此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰寫,因此和原課程內容有些出入。
問題描述
給予一個數值,把所有小於此數值的質數(Prime)都列出來:// 以陣列的方式列出小於 number 的所有質數
function sieveOfEratosthenes (number) {...}
sieveOfEratosthenes(20) // [2, 3, 5, 7, 11, 13,...
[演算法] Fibonacci:善用 cache 和 Memoization 提升程式效能
此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰寫,因此和原課程內容有些出入。
Memoization 是一種優化的技巧,透過藉由將函式的回傳值暫存起來,來提升效能,一旦發現有相同的輸入時(same inputs),就直接回傳暫存值出去。這裡的關鍵字就是「相同的輸入(same inputs)」。
前置知識: 費波那契數列(Fibonacci Sequence)
費波那契數列(Fibonacci Sequence)指的是:
1,...
[演算法] Binary Search:在陣列中尋找特定元素
此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰寫,因此和原課程內容有些出入。
問題描述
透過 binary search 的方式在一個陣列(numArray)中找出目標元素(target):function binarySearch(numArray, target) {...}
演算法實做
在 Big O Notation & Time Complexity 時,曾有使用...
[演算法] 遞回函式(recursive function, recursion)
此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰寫,因此和原課程內容有些出入。
什麼是遞回函式(recursion)
遞回函式(recursive function)簡單來說就是在一個函式當中再去呼叫它自己,其中一個實際的範例就是階層的計算(factorial)。
階層聽起來可能很陌生,但是大家高中數學一定接觸過,例如 5! = 5 x 4 x 3 x 2 x 1。
演算法實做
透過遞回函式來實做一個階層(!)的函式:
function...
2017年9月22日
[演算法] Two Sum
此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰寫,因此和原課程內容有些出入。
問題描述
指定一個特定的數字,在以陣列的方式傳入許多數字(numArray),看看能否在這些數字中透過加法組合出這個特定的數字:// return every pair of numbers from 'numArray' that adds up to the 'targetSum'
function...
[演算法] Harmless Ransom Note:計算陣列中各元素出現的次數
計算陣列中各元素出現的次數(calculate the number of elements in an array)
問題描述
這是一個類似單字剪報功能的演算法,告訴它我們希望得到哪些單字(noteText),然後在一篇文章(magazineText)中去尋找看看能不能找到這些單字,而且數量要足夠。
因此要寫一個 harmlessRansomNote function,並且代入兩個參數 noteText 和 magazineText,如果 noteText 中的單字和數量都能在 magazineText 中被找到,則回傳 true,否則回傳 false。// return...