如何寫程式來找出河內塔的最佳解?那不寫程式的話呢? 2020 年 6 月 25 日 Magic Len 研究分享、 Go、 Java、 數學邏輯、 Rust、 JavaScript 河內塔(Tower of Hanoi)是一個很謎的數學遊戲,它是由三根桿子(Rod)和一個以上大小不同的碟片(Disk)所組成的。在遊戲的一開始,這些碟片按照底大頂小的順序疊在一起,由三根桿子中的其中一根串著。玩家每次可以移動一個碟片到其它的桿子上,但是不能將比較大的碟片疊在比較小的碟片上。當玩家把所有碟片都串到指定的桿子,遊戲就結束了。 繼續閱讀
電腦是怎麼進行四則運算的?前序式、中序式、後序式又是什麼? 2020 年 6 月 18 日 Magic Len 研究分享、 Go、 Java、 Rust、 演算法、 JavaScript 我們從小學習算術的時候便知道「四則(加、減、乘、除)運算」的規則,也就是「先乘除、後加減,以及括號先算」。那麼如果我們要撰寫一個可以支援算式輸入且能夠按照四則運算規則求出結果的程式,該怎麼做呢? 繼續閱讀
如何將遞迴函數改成迭代函數? 2020 年 6 月 11 日 Magic Len 研究分享、 Go、 Java、 Rust、 JavaScript 遞迴(Recursive)函數是在執行的過程又會直接或間接地呼叫自己本身的函數。通常透過遞迴函數可以快速地驗證我們的演算法,用簡短的程式碼處理複雜的問題,但是函數在呼叫時需要建立新的堆疊框(Stack Frame),除了會需要額外的開支(Overhead)之外,如果在函數中呼叫函數,而這函數又會呼叫函數,持續下去,很容易就會造成堆疊溢出(Stack Overflow)。雖然有些程式語言的編譯器會做... 繼續閱讀
費氏搜尋(Fibonacci Search)演算法,運用費氏數列的搜尋演算法 2020 年 5 月 28 日 Magic Len 研究分享、 Go、 Java、 Rust、 演算法、 JavaScript 費氏搜尋(Fibonacci Search)演算法有點像是二元搜尋(Binary Search)演算法,同樣是在一個已排序好的陣列中搜尋元素,但是它在移動陣列索引值時是去參考費氏數列(Fibonacci Sequence),而不是像二元搜尋法那樣總是去取索引的中間值。也由於費氏搜尋法在移動陣列索引值時只需要進行加減運算,不需乘、除法,因此它適合被用在不擅長處理乘、除法的CPU上。 繼續閱讀
如何在Android或是Java程式語言中使用Rust的函式庫? 2019 年 10 月 8 日 Magic Len 研究分享、 Android、 Java、 Rust Java是一個需要運作在JVM上的程式語言,因此效能會比原生(native)程式還要來得差一些。不過對於一些比較需要花費硬體資源的運算(例如影像處理、聲音處理),我們還是可以透過Java提供的JNI(Java Native Interface)來連結並使用原生函式庫提供的功能來完成。Rust的函式庫也可以透過JNI來呼叫,在這篇文章中,會介紹如何把任意現有的Rust函式庫拿進Java程式語言中使用... 繼續閱讀
基數排序(Radix Sort)演算法,可以依據多個鍵值來排序的演算法 2019 年 5 月 30 日 Magic Len 研究分享、 Go、 Java、 Rust、 演算法、 JavaScript 基數排序(Radix Sort)演算法是可以利用多個鍵值來排序資料的演算法。排序還需要多個鍵值?有時候當然會需要啦!像是要排序檔案時,可以先依照檔案名稱排序後,再依照檔案大小來排,如此一來,整體上來看這些檔案,會是以檔案大小來排序,而相同檔案大小的檔案則是會依照檔案名稱來排序。基數排序法可以將整數的各個位數當作是鍵值,來進行線性時間的排序,比起會依照k(要排序的資料可能的值的數量)愈大而愈吃空間的... 繼續閱讀
桶排序(Bucket Sort)演算法,利用運算式將資料分類、排序後,再合併起來的排序演算法 2019 年 5 月 26 日 Magic Len 研究分享、 Go、 Java、 Rust、 演算法、 JavaScript 桶排序(Bucket Sort)演算法是先將大量資料分類成少量資料後,再進行排序的演算法。可以透過簡單的運算式來完成資料的分類,在最好的情況之下,資料可以被完全打散,此時的時間複雜度就會是一個線性時間。 繼續閱讀
暴力字串搜尋(Brute-force Substring Search)演算法,簡單粗暴地在一個字串中尋找子字串 2019 年 5 月 20 日 Magic Len 研究分享、 Go、 Java、 Rust、 演算法、 JavaScript 暴力字串搜尋(Brute-force Substring Search)演算法是最基本的字串搜尋演算法。它可以按照原文中字元的順序,逐一與搜尋樣本(pattern)進行比對,判斷目前的搜尋位置是否就是搜尋樣本存在的位置。 繼續閱讀
插補搜尋(Interpolation Search)演算法,運用資料近似線來輔助搜尋的演算法 2019 年 5 月 18 日 Magic Len 研究分享、 Go、 Java、 Rust、 演算法、 JavaScript 插補搜尋(Interpolation Search)演算法又稱為內插搜尋演算法,是二元搜尋(Binary Search)演算法的變體。這套演算法可以在已排序好的序列中根據資料的預測線或近似線來進行高效率的搜尋,近似線愈精準,搜尋的效率就愈高。 繼續閱讀
指數搜尋(Exponential Search)演算法,搜尋目標在序列愈前面就愈快的演算法 2019 年 5 月 16 日 Magic Len 研究分享、 Go、 Java、 Rust、 演算法、 JavaScript 指數搜尋(Exponential Search)演算法又稱為雙倍搜尋(Doubling Search)演算法或是蔓延搜尋(Galloping Search)演算法,是二元搜尋(Binary Search)演算法的變體。這套演算法可以在已排序好的序列中進行高效率的搜尋,要搜尋的元素在序列中愈前面的話,搜尋效能愈好。 繼續閱讀