怎麼才算真正掌握了乙個資料結構或演算法?

2021-10-16 17:54:43 字數 1619 閱讀 9323

很多人學演算法都是死記硬背**實現,對於一些簡單的資料結構和演算法,背起來還不複雜,但是,對於比較複雜的,比如紅黑樹、字串匹配中的bm、kmp演算法、ac自動機,看懂都難,更別說背下來一直不忘了。事實上,在我們學習資料結構和演算法的時候,真的需要背誦原理、**實現,還追求一直不忘嗎?

要搞清楚這個問題,我們需要知道,怎麼才算是真正掌握了乙個資料結構和演算法?這個問題要一分為二的看。我們可以將資料結構和演算法,簡單的分為基礎部分和高階部分。

那哪些屬於基礎的部分呢?

比如鍊錶、陣列、佇列、棧、二叉樹、堆、圖的定義等這些算是基礎的結構,排序、二分查詢、二叉樹的遍歷、圖的廣度、深度優先搜尋、字串樸素匹配演算法,這些算是基礎的演算法,還有遞迴、分治、貪心、回溯、動態規劃,這些算是基礎的演算法思想。

那哪些屬於高階的部分呢?

比如我們開頭提到的紅黑樹、bm演算法、kmp演算法,還有ac自動機等,還有圖的一些演算法,這些都屬於一些高階的資料結構和演算法部分。

實際上,不管是基礎資料結構和演算法,還是高階資料結構和演算法,我們更側重掌握它的特點、時間空間複雜度、能解決的問題、應用場景。畢竟掌握了這些之後,我們就可以在實際的開發中,遇到相應的問題或者場景,能快速的反映出,可以用哪種資料結構和演算法解決。對原理或者**實現,即便你可能已經記憶不清楚了,但也可以通過重溫一遍,快速的掌握。實話講,你讓我再講一講紅黑樹的原理、bm、kmp演算法的處理流程,我也說不出來,但這並不影響我可以靈活的應用他們。

不過,對於前面提到的基礎資料結構和演算法,我們可能要掌握的東西更多一些。除了特點、複雜度、能解決的問題、應用場景之外,我們還要牢固掌握原理,並能輕鬆**實現。因為,畢竟這些基礎的資料結構和演算法,原理和實現並不複雜,而且很多都是其他高階資料結構和演算法的基礎。

但是對於前面提到的高階資料結構和演算法,我們就不需要背誦原理和實現了。大部分情況下,像紅黑樹、bm、kmp演算法之類的複雜資料結構和演算法,我們只需要當下能看懂,能對照原理,一步一步將**實現,就可以了,不必強迫要求自己合上書之後,還能把原理默背出來、**莫寫出來。

你可能還會糾結於說,雖然當下能看懂,但過不幾天又忘了,算是掌握了嗎?

實際上,我們回歸到學資料結構和演算法的本質上,實際上,它更多的是鍛鍊一種邏輯思維能力。而你能看懂乙個複雜的演算法,本身就需要花費很多的時間、腦力去思考,這本身就是一種邏輯思維能力的鍛鍊。我們要重視過程,而不要太重視結果。畢竟學習演算法不是為了考試,不要被應試教育所束縛。

你可能還會說,原理我能看懂,但**實現不了,咋辦?

實際上,**實現能力是一種綜合能力,切不可過於著急。如果你平時都是寫些邏輯並不是很複雜、不是很燒腦的crud業務**,那邏輯思維能力鍛鍊、複雜演算法編碼翻譯能力的鍛鍊,實際上是很欠缺的,想要一下子就能實現像bm、kmp這樣的複雜演算法,實際上是不現實的。所以,你需要從實現簡單的演算法、資料結構開始,慢慢鍛鍊自己的邏輯思維能力,複雜邏輯的**翻譯能力。

你可能還會說,記不住紅黑樹、bm演算法、kmp演算法的原理和實現,面試的時候被問到,咋辦?

實際上,幾乎沒有面試官會問你這些問題的。這些都是純記憶性的文科問題,即便你能寫出紅黑樹,也只能說你背誦能力不錯,並不能考察到什麼邏輯思維能力、演算法能力。不過,我也聽過確實有面試官拿紅黑樹的左右旋的調整來考察候選人。對於這種情況,面試官本身可能就是不靠譜的,我們直接無視就好,換家公司再面試。

總之,學乙個東西,我們要知道學什麼?學習的側重點,掌握到什麼程度算是ok了,這樣我們才能有的放矢,事半功倍!

怎麼才算乙個真正的程式設計師

在網際網路高速發展的今天,每個人似乎都融入了網際網路的環境裡。因此而造就了很多的 程式設計師 以至於每年的10月24,被定位程式設計師日。在這樣的行業裡,似乎每個人多多少少會一些程式設計,於是生產出大量自稱程式設計師或者自以為是程式設計師的人。關於程式設計師的段子,也在網上廣泛生產傳播,什麼程式猿 ...

怎麼樣才算愛乙個人

愛是一種心靈的整體狀態,尤其不能把愛和純本能的衝動,即使是昇華的衝動視為一事。衝動,本質是是以滿足他的嗜欲為能事。愛,是以肯定價值以及創造價值的態度,把自己轉向對方。當你是愛的時候,你會想到的是對方,會以她為重,以她為超越你之上的一種關注,你會怕傷害她,你會怕影響她,當他不幸福當她哭泣的時候,你會比...

乙個陣列儲存了N個結構

乙個陣列儲存了n個結構,每個結構儲存了乙個座標,結構間的座標都不相同,請問如何找到指定座標的結構 除了遍歷整個陣列,是否有更好的辦法 要麼預先排序,二分查詢。要麼雜湊。hash的話,座標 x,y 你可以當做乙個2位數,寫乙個雜湊函式,把 x,y 直接轉成 x,y 作為key,預設用string比較。...