[譯] 如何提高你的數據結構、算法以及解決問題的能力

如何提高你的數據結構、算法以及解決問題的能力

![Source: [Arafat Khan]()](https://raw.githubusercontent...前端

這篇文章借鑑了我過去在學校一個學期的我的經歷和挑戰,當我進入學校的時候,我對任何 DSA(數據結構和算法)和解決問題的策略幾乎一無所知。做爲一名自學成才的程序員,我對通常編程會更加熟悉和溫馨,例如面向對象編程,而不是 DSA 問題所須要的解決問題的能力。node

這篇文章反映了我整個學期的經歷,幷包含了爲了快速提升數據結構、算法和解決問題的能力而求助的資源。android

面臨問題:你知道原理,可是你被實際應用卡住了

我在學期初期的時候遇到這個問題,當時我不明白我哪裏不懂,這是一個特別嚴重的問題。我對這個理論很瞭解,例如,什麼是鏈表,它是如何工做的,它的各類操做和時間複雜度,它支持的 ADT(抽象數據類型),以及如何實現 ADT 操做。ios

可是,因爲我不明白我哪裏不懂,因此我沒法肯定我對它的理解和在實際應用中解決問題的差距。git

不一樣類型的問題

一個數據結構問題的例子:描述如何在鏈表中插入一個節點並說明時間複雜度。程序員

這是一個算法問題:在旋轉數組中查找元素並說明時間複雜度。github

最後是解決問題的疑慮,我認爲比以前兩個問題的級別更高,這可能須要簡要描述一個場景,而且列出問題的要求。在考試中,可能會要求你對解決方案進行描述。在編程比賽中,可能會要求你在不明確提供任何的數據結構和算法的狀況下提交可運行的代碼。換句話說,它們但願你能使用最適合的數據結構和算法來儘量有效地解決問題。算法

如何提高你的數據結構、算法和解決問題的能力。

我主要使用三個網站來練習:HackerRankLeetCodeKattis。它們很是類似,特別是前兩個,但不徹底相同。我發現每一個網站的側重點略有不一樣,每一個網站都以本身的方式爲用戶提供最大化的幫助。編程

我將解決問題所需的技能大體分爲:後端

  1. 數據結構知識
  2. 算法知識
  3. 數據結構和算法知識的應用

前兩個被視爲」基元「或構建塊,第三點就涉及如何將數據結構和算法應用於特定的場景。

數據結構知識

在這方面,我發現 HackerRank 是一個寶貴的資源,它有一個專門用於數據結構的部分,你能夠按類型過濾,好比數組、鏈表、(平衡)樹、堆 ......

這些問題與其說是關於如何解決問題,不如說是如何處理數據結構。例如:

  1. 數組:數組旋轉數組操做
  2. 鏈表:反轉鏈表循環檢測
  3. 樹:節點交換二叉搜索樹的驗證

你明白了,有些問題可能永遠都不會直接適用於解決問題。但它們很是適合概念性理解,這在任何狀況下都是很是重要的。

HackerRank 沒有可自由訪問的」模型解決方案「,儘管討論部分時常充滿了提示、線索、甚至是可用的代碼片斷。到目前爲止,我發現這些是足夠的,雖然你可能須要在集成開發環境中一行一行地執行代碼才能真正地理解某些內容。

算法知識

HackerRank 也有一個算法部分,儘管我更喜歡用 LeetCode。我發現 LeetCode 上的問題涉及範圍更廣,而且我真正喜歡的是,許多問題的解決方案中都帶有詳解甚至是時間複雜度的說明。

從 LeetCode 上點贊前 100 的問題開始學習是一個很好地開始。如下是一些我認爲很好的問題:

與數據結構問題不一樣,這裏的側重點並非處理或操做數據結構,而是如何作一些事。例如:「帳戶合併」問題主要就是並查集算法的應用。「搜索旋轉排序數組」問題提出了二分查找的變形。有時你會學習一種全新的解決問題的技巧。例如:「滑窗窗口」解決方案用於「最長連續遞增序列」問題。

數據結構和算法知識的應用

最後,我使用 Kattis 來提高我解決問題的能力。Kattis 問題歸檔中有許多來自不一樣渠道的編程問題,好比來自全世界的一些編程比賽。

因爲沒有官方的解決方案和討論區(不像 HackerRank 和 LeetCode 同樣),Kattis 使人很是沮喪。此外,測試用例也是私有的。我有一些少數待解決的 Kattis 問題,我沒法解決它並非由於我不知道解決方案,而是由於我沒法找出 bug。

這是三個練習和學習網站中我最不喜歡的,我也並無花太多的時間在上面。

其餘資源

Geeksforgeeks 是另外一個對於學習數據結構和算法很是有價值的資源。我喜歡它提供各類語言的代碼片斷,一般是 C++、Java 以及 Python,你能夠將其複製而後粘貼到集成開發環境中以逐行執行。

最後,還有值得信賴的老谷歌,它會讓你在大多數時間裏都能看到 GeeksForGeeks 和提供可視化解題的 Youtube。

結論

然而,歸根到底,這條路沒有捷徑可走。你只須要一頭扎進去,開始寫代碼、調試代碼而且閱讀其餘人的正確代碼,找出你錯在哪、怎麼錯、爲何會錯。這很艱難,但每次嘗試都會變得更好,隨着你變得更好,它也將會變容易。

我遠沒有達到我想要的水平,但我知道,當我啓程時便註定路遠迢迢。

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。

掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄
相關文章
相關標籤/搜索