機器學習需要學習數據結構嗎?

很多沒有找工作的同學經常會有這樣的疑問,總是聽人說數據結構重要,但是除了感覺它之外也沒其他感覺啊?很多工作的同學在介紹經驗的時候都會告訴你,數據結構很重要,都後悔自己沒好好學!其實這也側面說明了一個問題,就是學校和社會的差別!今天了我們就來談談學習數據結構的重要性!

首先說說基本的定義:程序=演算法+數據結構。這個定義大家都不陌生,從這個定義可以看出,如果你想寫一個好的程序,沒有數據結構做支撐是不可能的。

然後我們打個比方:數據結構和演算法,就好比兵法,懂排兵布陣的將軍,要比不懂的要更能把控戰爭的贏面。換句話說就是你如果不懂數據結構,你可能就只能做個小卒了!

最後我用自己的不夠成熟的經歷來談談這個問題。

Advertisements

我相信大多數程序員和我一樣,剛開始學習編程的時候,肯定都是這麼個過程,從C語言開始,看著26個字母組成的一行行數據,不知道會發生什麼,當看著程序運行之後冒出的結果就會感到興奮,進而對代碼產生興趣。但是在以後的學習的路程中總會沿著這樣一條路走,總是沉迷於可視化的程序,什麼意思呢就是說只有寫的程序運行處窗口或者做出一個APP之後才會歡喜鼓舞,然而對於構建出這些程序的底層代碼卻不慎了解。終於有一天你歡欣鼓舞的去找工作的時候,第一盆被潑的冷水就是,你所說的我們都知道,你所做的人家早就不用了,而你又講不出個所以然,這樣對你的印象就會大打折扣,你所謂的「牛」在別人眼裡只不過是低級的部分而已。一場面試(即使是無關緊要的),會檢驗出你的水平,也會告訴你你該去學什麼。當然,面試之後你就會感覺到要學的不止數據結構還有其他,但是每一場面試都會告訴你數據結構很重要,那麼到底有多重要呢?

Advertisements

我們都知道,九層之台起於壘土,可以這麼說數據結構就是你將來編程的基礎,學數據結構不止是學那點只是,更重要的是學一種思想!何為思想呢?簡單說就是你思考問題的過程,給你一個編程題,你不會再用n重循環去解決問題,而是用合適的數據結構去解決問題。下面是一段知乎上的一段話

個人認為數據結構是編程最重要的基本功沒有之一!

學了順序表和鏈表,你就知道,在查詢操作更多的程序中,你應該用順序表;而修改操作更多的程序中,你要使用鏈表;而單向鏈表不方便怎麼辦,每次都從頭到尾好麻煩啊,怎麼辦?你這時就會想到雙向鏈表or循環鏈表。

學了棧之後,你就知道,很多涉及后入先出的問題,例如函數遞歸就是個棧模型、Android的屏幕跳轉就用到棧,很多類似的東西,你就會第一時間想到:我會用這東西來去寫演算法實現這個功能。

學了隊列之後,你就知道,對於先入先出要排隊的問題,你就要用到隊列,例如多個網路下載任務,我該怎麼去調度它們去獲得網路資源呢?再例如操作系統的進程(or線程)調度,我該怎麼去分配資源(像CPU)給多個任務呢?肯定不能全部一起擁有的,資源只有一個,那就要排隊!那麼怎麼排隊呢?用普通的隊列?但是對於那些優先順序高的線程怎麼辦?那也太共產主義了吧,這時,你就會想到了優先隊列,優先隊列怎麼實現?用堆,然後你就有疑問了,堆是啥玩意?自己查吧,敲累了。

總之好好學數據結構就對了。我覺得數據結構就相當於:我塞牙了,那麼就要用到牙籤這「數據結構」,當然你用指甲也行,只不過「性能」沒那麼好;我要擰螺母,肯定用扳手這個「數據結構」,當然你用鉗子也行,只不過也沒那麼好用。學習數據結構,就是為了了解以後在IT行業里搬磚需要用到什麼工具,這些工具有什麼利弊,應用於什麼場景。以後用的過程中,你會發現這些基礎的「工具」也存在著一些缺陷,你不滿足於此工具,此時,你就開始自己在這些數據結構的基礎上加以改造,這就叫做自定義數據結構。而且,你以後還會造出很多其他應用於實際場景的數據結構。。你用這些數據結構去造輪子,不知不覺,你成了又一個輪子哥。

現在都在講大數據,你可曾想過這麼大的數據如果不讓你用Hadoop、Spark等框架你會怎麼去做,我會告訴你這裡邊就有數據結構可用?當你遇到性能問題的時候,當你的程序遇到瓶頸之後你會想到數據結構,他會告訴你這些問題的。

其實總是說很多,你可能不會懂,當你學習一段時間之後你或許會有感觸的!

謝謝閱讀,這僅僅代表我的個人觀點,歡迎留言!

Advertisements

你可能會喜歡