以前換工做的時候,好多公司都喜歡在面試的過程當中考察數據結構、算法,甚至手寫代碼,尤爲是大廠。面試
回想我從剛開始工做至今,一直侷限於公司業務之中,成天作的無非是 CURD,外加疑難雜症定位解決,可是更多的時候,是利用其餘人已經封裝好的現成的接口、類庫來堆砌、翻譯業務邏輯,不多須要本身實現數據結構和算法。算法
因此數據結構和算法算是個人軟肋,數據結構只會一些簡單的數組、鏈表、樹,算法也只是粗略的掌握了幾種經常使用的排序算法。數據庫
顯而易見,凡是面試時要我手寫數據結構與算法相關代碼的,我無一例外的都掛了。爲了避免讓數據結構和算法拖我後腿,我報名參加了王爭老師的《數據結構與算法之美》的訓練營,決心補齊本身的短板。編程
接下來的一段時間,我會根據本身的學習進度,逐步的更新《數據結構與算法》系列博文,記錄本身的學習成長的歷程。數組
在學習以前,先摘錄了王爭老師的一些對數據結構和算法的看法,書於此處,以做入門。數據結構
上面有提到,剛開始工做的時候,只是一名業務研發人員,寫代碼歷來都只是完成功能,不考慮非功能性的需求,更多的是利用已經封裝好的現成的接口、類庫來堆砌、翻譯業務邏輯,不多須要本身實現數據結構和算法;框架
再加上所處行業的侷限性,最終致使的結果就是,雖然經歷的項目有幾十個,簡歷寫了好多頁,可是細看下來,每一個項目都是重複的堆砌業務邏輯而已,徹底沒有難度遞進,沒有能力的提高,只是日復一日的搬磚,成爲名副其實的 IT 民工。數據結構和算法
可是,不須要本身實現,並不表明什麼都不須要了解。函數
若是不知道平常使用的這些類庫背後的原理,不懂得時間、空間複雜度分析,如何能利用好、用對它們?存儲某個業務數據的時候,如何評估到底該使用 ArrayList 仍是 LinkedList 呢?調用了某個函數或方法以後,又該如何評估代碼的性能和資源的消耗呢?性能
平常的開發中,咱們會避免不了使用各類框架和中間件,好比 Spring、Redis 等等。在這些基礎框架和中間件當中,通常都糅合了不少的基礎數據結構和算法的設計思想。好比咱們經常使用的 Key-Value 數據庫 Redis,裏面的有序集合是用什麼數據結構來實現呢?爲何要用跳錶來實現呢?爲何不用二叉樹呢?
若是可以弄明白這些底層原理,就能更好的使用它們。即使出現問題,也很容易就能定位,所以,掌握數據結構和算法,無論對於閱讀框架源碼,仍是理解其背後的設計思想,都是很是有用的。
怎麼評判一我的的編程能力?可能有的人會提到可讀性、健壯性、可擴展性這些指標。其實評判一我的的編程能力的指標有不少,可是,代碼性能絕對是其中一個很是重要的評判標準。
但是若是連代碼的時間複雜度、空間複雜度都不知道怎麼分析,怎麼寫出高性能的代碼呢?
若是你在一家成熟的公司,面對的是千萬級甚至億級的用戶,性能幾乎是開發過程當中時刻都要考慮的問題。一個簡單的 ArrayList 、LinkedList 的選擇問題,均可能產生成千上萬倍的性能差異。這個時候,學習數據結構和算法的意義就凸顯出來了。
並非爲了死記硬背幾個知識點。
咱們的目的是簡歷時間複雜度、空間複雜度意識,寫出高質量的代碼,可以設計基礎框架,提高編程技能,訓練邏輯思惟,積攢人生經驗,以此得到工做回報,實現你的價值,完善你的人生。
因此,無論你是否是業務開發工程師,是否是初入職場的初級工程師,數據結構和算法做爲計算機的基礎知識、核心知識,都是必需要掌握的。
掌握了數據結構與算法, 看待問題的深度、解決問題的角度,就會徹底不同。
從廣義上講,數據結構就是指一組數據的存儲結構,算法就是操做數據的一組方法。
從狹義上講,就是特指某些著名的數據結構和算法,好比隊列、棧、堆、二分查找、動態規劃等。這些都是前人的只會結晶,咱們能夠直接拿來用。
數據結構是爲算法服務的,算法要做用在特定的數據結構之上。所以咱們沒法孤立數據結構來說算法,也沒法孤立算法來說數據結構。數據結構是靜態的,它只是組織數據的一種方式,若是不在他的基礎上操做、構建算法,孤立存在的數據結構就是沒用的。
想要學習數據結構與算法,首先要掌握一個數據結構與算法中最重要的概念 -- 複雜度分析。
這個概念有多重要呢?能夠這麼說,它幾乎佔了數據結構和算法這門課程的半壁江山,是數據結構和算法學習的精髓。
搞定複雜度分析,就要進入數據結構與算法的內容了。
王爭老師在訓練營裏面總結了 20 個最經常使用的、最基礎的數據結構與算法,不論是應付面試仍是工做須要,只要集中精力逐一攻克這 20 個知識點就足夠了。
這裏麪包括 10 個數據結構:
包括 10 個算法:
學習數據結構與算法的過程,是很是好的思惟訓練的過程,因此,千萬不要被動地記憶,要多辯證地思考,多問爲何。若是你一直堅持這麼作,你會發現,等你學完以後,寫代碼的時候就會不禁自主地考慮不少性能方面的事情,時間複雜度、空間複雜度很是高的垃圾代碼出現的次數就會愈來愈少。你的編程內功就真正獲得了修煉。
「邊學邊練」這一招很是有用。建議每週花 1-2 個小時的時間,集中把學習的數據結構和算法,全都本身寫出來,用代碼實現一遍。這樣必定會比單純地看或者聽的效果要好不少。
至於「刷題」,能夠「適度」刷題,但必定不要浪費太多時間在刷題上。學習的目的主要仍是掌握,而後應用。
學習最好的方法,是找到幾我的一塊兒學習,一起討論切磋,有問題及時尋求幫助。
學習的過程當中,最大的問題就是堅持不下來。因此,咱們在枯燥的學習過程當中,也能夠給本身設立一個切實可行的目標,就像打怪升級同樣。
在學習的過程當中必定會遇到「攔路虎」,若是哪一個知識點沒有怎麼學懂,不要着急,這是正常的。由於,想聽一遍、看一遍就把全部知識掌握,這確定是不可能的。學習知識的過程是反覆迭代、不斷沉澱的過程。
最後,附思惟導圖一張,一樣取自王爭老師的訓練營,用於描述完整的數據結構與算法知識體系(侵刪):