譯 如何提公升你的資料結構 演算法以及解決問題的能力

2021-10-01 11:40:57 字數 2196 閱讀 9763

這篇文章借鑑了我過去在學校乙個學期的個人經歷和挑戰,當我進入學校的時候,我對任何 dsa(資料結構和演算法)和解決問題的策略幾乎一無所知。作為一名自學成才的程式設計師,我對一般程式設計會更加熟悉和舒適,例如物件導向程式設計,而不是 dsa 問題所需要的解決問題的能力。

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

我在學期初期的時候遇到這個問題,當時我不明白我**不懂,這是乙個特別嚴重的問題。我對這個理論很了解,例如,什麼是鍊錶,它是如何工作的,它的各種操作和時間複雜度,它支援的 adt(抽象資料型別),以及如何實現 adt 操作。

但是,由於我不明白我**不懂,所以我無法確定我對它的理解和在實際應用中解決問題的差距。

不同型別的問題

乙個資料結構問題的例子:描述如何在鍊錶中插入乙個節點並說明時間複雜度。

這是乙個演算法問題:在旋轉陣列中查詢元素並說明時間複雜度。

最後是解決問題的疑慮,我認為比之前兩個問題的級別更高,這可能需要簡要描述乙個場景,並且列出問題的要求。在考試中,可能會要求你對解決方案進行描述。在程式設計比賽中,可能會要求你在不明確提供任何的資料結構和演算法的情況下提交可執行的**。換句話說,它們希望你能使用最適合的資料結構和演算法來盡可能有效地解決問題。

我主要使用三個**來練習:hackerrank、leetcode 和 kattis。它們非常相似,特別是前兩個,但不完全相同。我發現每個**的側重點略有不同,每個**都以自己的方式為使用者提供最大化的幫助。

我將解決問題所需的技能大致分為:

資料結構知識

演算法知識

資料結構和演算法知識的應用

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

資料結構知識

在這方面,我發現 hackerrank 是乙個寶貴的資源,它有乙個專門用於資料結構的部分,你可以按型別過濾,比如陣列、鍊錶、(平衡)樹、堆 …

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

陣列:陣列旋轉、陣列操作

鍊錶:反轉鍊錶、迴圈檢測

樹:節點交換、二叉搜尋樹的驗證

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

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

演算法知識

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

從 leetcode 上點讚前 100 的問題開始學習是乙個很好地開始。以下是一些我認為很好的問題:

與資料結構問題不同,這裡的側重點並不是處理或運算元據結構,而是如何做一些事。例如:「賬戶合併」問題主要就是並查集演算法的應用。「搜尋旋轉排序陣列」問題提出了二分查詢的變形。有時你會學習一種全新的解決問題的技巧。例如:「滑窗視窗」解決方案用於「最長連續遞增序列」問題。

資料結構和演算法知識的應用

最後,我使用 kattis 來提公升我解決問題的能力。kattis 問題歸檔中有許多來自不同渠道的程式設計問題,比如來自全世界的一些程式設計比賽。

由於沒有官方的解決方案和討論區(不像 hackerrank 和 leetcode 一樣),kattis 令人非常沮喪。此外,測試用例也是私有的。我有一些少數待解決的 kattis 問題,我無法解決它並不是因為我不知道解決方案,而是因為我無法找出 bug。

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

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

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

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

譯文出自:掘金翻譯計畫

譯者:todaycoder001

校對者:江五渣、xurui1995

如何提公升資料結構方面的演算法能力?

我們學習c語言是學習如何編寫程式,而資料結構可以幫助我們如何簡潔高效的編寫程式,那如何提公升資料結構體的演算法能力呢?當我們遇到乙個實際的問題,需要寫程式去解決,我們需要解決的是兩方面的問題,一是如何表達資料之間的邏輯規律及如何將資料儲存到計算機中,二是採用什麼方法來解決問題。這兩個方面可以直接概括...

資料結構以及常見演算法

資料結構 1 陣列 雜湊表 棧 佇列 鍊錶 樹 圖等等的定義 2 資料結構的遍歷 a 陣列 通過下標就可以遍歷 常見題目 1 陣列下標是0到n 1的數字,如果陣列元素是0到n 1的數字的時,這種題目經常會構成閉環,以元素作為下標之類。比如0到n中重複的元素,100死囚犯問題等等。2 陣列遍歷方向問題...

資料結構與演算法 01 如何學習資料結構與演算法

過於學術的概念定義比較抽象,難以理解。我們從廣義和狹義兩個層面,來理解資料結構與演算法這兩個概念。從廣義上講,資料結構就是指一組資料的儲存結構 怎麼放 演算法就是運算元據的一組方法 怎麼用 我們以圖書館的場景為例來進一步理解 圖書館書籍量十分巨大,首先要分類設定閱覽室,譬如社科類 科技類 報刊類等。...