iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
1
自我挑戰組

LeetCode演算法刷題 使用Go系列 第 1

Day01-[LeetCode演算法刷題 使用Go] -基本介紹

  • 分享至 

  • xImage
  •  

Day01-基本介紹

參賽動機

目前人在台中一間公司擔任後端工程師,因為公司使用 Go 開發,所以這次活動就選擇了這門程式語言。個人背景為數學系,對數據分析、演算法、機器學習領域較感興趣。之前下班時間有寫過一些題目,趁這次機會回顧做整理,一方面也練習寫文章。而此系列文預計以 LeetCode 上難度 Easy 的題目為主。

Go語言

Go 是由 Google 開發的一種程式語言,於 2009 年正式推出,至今已超過 10 個年頭,
軟體評價公司 TIOBE 評價為「TIOBE 2016 年最佳語言」。 Go 還有 21 世紀的 C 語言之稱。這邊要正名一下,作者強調該語言正式名稱為 Go,通俗稱呼為 Golang ( The Go Programming Language ),是因為官方網站域名為 https://golang.org/,且用 golang 在網路上比較方便查找資料。
想要入門 Go 語言的話可以查看官網的教學文檔: A Tour of Go
另外也有線上編譯器可以練習: The Go Playground

LeetCode

LeetCode 是一個線上解題系統,支援各種程式語言。裡面有許多類別的題目以及一些定期競賽。我們關注的類別為演算法,LeetCode 收錄的題目多為軟體工程師面試考古題,做完題目提交程式碼會進行測試。在通過測試後,可以看到自己的程式碼運行時間 (Runtime) 以及 記憶體使用量 (Memory Usage) 跟其他過關的程式碼比較排名為何。detail 選項中可以看到其他人的參考程式碼,還有提供討論區與其他使用者交流。LeetCode 個人檔案也會顯示你的通過率 (Acceptance Rate)。
算法為: 程式碼的通過次數/提交次數。刷題時建議先多測試幾組資料再提交,一方面培養嚴謹的習慣,同時也可以讓通過率數據美觀一點。

演算法與複雜度

演算法的基本概念為解決問題的過程。
在能解決該問題的前提下,要怎麼讓自己的程式執行更加有效率,這就是演算法的優化。我們可以透過分析執行的具體步驟來評估演算法的優劣,一般使用漸近時間複雜度 O( ) 來描述執行時間的複雜度 。舉例來說:當輸入的個數為 n ,而分析此演算法後發現需要 4n³+6n 個步驟,當 n 很大時 n 與 n³ 相比可以忽略,所以此演算法時間複雜度用 O(n³) 表示。而我們通常採用此演算法的最糟情況的時間複雜度。此外我們也會評估執行此演算法時所占的記憶體空間來計算空間複雜度

時間複雜度評估

Example 1 : 要計算 https://chart.googleapis.com/chart?cht=tx&chl=%24%24S_n%3D%5Csum%20_%7Bi%3D0%7D%5E%7Bn%7Di%3D0%2B1%2B2%2B...%2Bn%3D%3F%24%24

  • 方法I : 逐項相加,共做了 n次加法 ,需要的計算步驟與 n 有關,記為 O(n) 。
  • 方法II : 由 級數和公式 可得 https://chart.googleapis.com/chart?cht=tx&chl=%24%24S_n%3D%5Cfrac%7Bn(n%2B1)%7D%7B2%7D%24%24,只需要做常數次的加法乘法,與 n 的大小無關,記為 O(1)。

Example2: 要計算 https://chart.googleapis.com/chart?cht=tx&chl=%24%24S_n%3D%5Csum%20_%7Bi%3D0%7D%5E%7Bn%7Di%5E2%3D0%5E2%2B1%5E2%2B2%5E2%2B...%2Bn%5E2%3D%3F%24%24

  • 方法 I : 逐項平方再相加,共做了 (n+1) 次乘法和 n 次加法,時間複雜度為 O(n) 。
  • 方法 II :由 級數和公式 可得 https://chart.googleapis.com/chart?cht=tx&chl=%24%24S_n%3D%5Cfrac%7Bn(n%2B1)(2n%2B1)%7D%7B6%7D%24%24 ,時間複雜度為 O(1)。

小結

演算法好壞對程式執行效能影響極大,以執行步驟 n 次與 n² 次為例:
當 n=1000 時,就差了 1000 倍。而我們實務上一般可接受的演算法時間複雜度為 O(n²)。今天的基本介紹就到這邊,下一篇會開始做 LeetCode 上的題目。


下一篇
Day02-[LeetCode演算法刷題 使用Go] -Two Sum
系列文
LeetCode演算法刷題 使用Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
hahaOWO
iT邦新手 5 級 ‧ 2020-09-11 14:12:45

可以分享一下工作心得嗎 /images/emoticon/emoticon08.gif

ahero0963 iT邦新手 3 級 ‧ 2020-09-11 19:59:09 檢舉

您好,我這次活動預期只講演算法主題耶。之後有機會的話再整理一下工作相關心得。

我要留言

立即登入留言