Java資料結構和演算法(一)——開篇,java資料結構

來源:互聯網
上載者:User

Java資料結構和演算法(一)——開篇,java資料結構

這篇文章裡面不講技術,抽空講講技術和通俗之間有一種奇特的關係,還有驅動力學習的東西。


1)技術與通俗

大學裡面那本嚴蔚敏的資料結構不厚,內容豐富,但是複雜問題的講解方面篇幅這樣就少了,比較難理解,c也不是很擅長,但是基本的思路還是有的。

簡單的鏈表,數組,堆棧,隊列,圖,幾個排序演算法。


後面看到知乎濤吳的回答,當時很震撼,這裡引用一下他的回答:


如果說 Java 是自動檔轎車,C 就是手動檔吉普。資料結構呢?是變速箱的工作原理。你完全可以不知道變速箱怎樣工作,就把自動檔的車子從 A 開到 B,而且未必就比懂得的人慢。寫程式這件事,和開車一樣,經驗可以起到很大作用,但如果你不知道底層是怎麼工作的,就永遠只能開車,既不會修車,也不能造車。如果你對這兩件事都不感興趣也就罷了,資料結構懂得用就好。但若你此生在編程領域還有點更高的追求,資料結構是繞不開的課題。

Java 替你做了太多事情,那麼多動不動還支援範型的容器類,加上垃圾收集,會讓你覺得編程很容易。但你有沒有想過,那些容器類是怎麼來的,以及它存在的意義是什嗎?最粗淺的,比如 ArrayList 這個類,你想過它的存在是多麼大的福利嗎——一個可以隨機訪問、自動增加容量的數組,這種東西 C 是沒有的,要自己實現。但是,具體怎麼實現呢?如果你對這種問題感興趣,那資料結構是一定要看的。甚至,物件導向編程範式本身,就是個資料結構問題:怎麼才能把資料和操作資料的方法封裝到一起,來造出 class / prototype 這種東西?

此外,很重要的一點是,資料結構也是通向各種實用演算法的基石,所以學習資料結構都是提升內力的事情。


反正我有醍醐灌頂的感覺,好比說,我有在編程上更厲害的追求,怎麼能死在資料結構上的感覺。


其實要將一門難懂的技術通俗地講給不懂的人聽,需要很大的功力,包括之前我寫的那篇《C與指標》剛開始的時候,那個C語言有什麼用回答也是他寫的,我很佩服這樣的人。


所以當你能把一件東西清楚的講解給別人聽,類似前幾篇文章提到的橡皮鴨調試法一樣,你搞懂了,摸清楚了。跟一個技術人士用技術的語言講解,非專業人士通俗語言講解。


當然了,前提需要積累。具體可以參見一下CSDN裡面關於羅昇陽的訪談——

專訪羅昇陽:老羅的Android之旅

當時嚇了我一跳,之前以為和那個老羅同個層級的年齡,後面發現好年輕的小夥子,積累,慢慢積累。



2)驅動力學習

當你看到你自己玩過的馬里奧可以自己寫出來的時候是不是心動了?頓時學習的驅動力是不是有了——我要做一個這樣的東西出來,然後開始學,直到自己動手完成。


當時我在大學裡就在推算,按照我這個學習速度,10年之後那也可以牛逼哄哄啊。有些人為什麼技術沒有提升,幾年之後還是那樣,因為驅動力的東西,有段時間我曾經停下來過,Java的差不多都學完了,幹什嗎?


因為從J2SE到EE的東西,大體的看完做過,然後就有一段迷茫期了,驅動力也沒有了。後面意識到自己太膚淺了,還有其他一些熱門的架構沒用,最好的單例你寫出來了嗎,虛擬機器你深入了嗎,Java還有很多經典書籍沒看呢?

以學習新知識為驅動力也是可以的,期間不停地學到新知識是很有成就感和很興奮的東西——原來是這樣xx。


還有一種——目標驅動,當時要做一個網路相關的東西——想到了爬蟲,然後以做出這東西為目的,收集資料,看別人的代碼,這樣的驅動力學習也是可以的。工作的時候,如果目標只放在工作的項目,每次的項目都有新的東西在裡面,那是可以學到東西的,一成不變的話,只能自己去發掘了。

不然哪有那個學習到半夜的——專訪雷果國:從1.5K到18K 一個程式員的5年成長之路。


我要學Python,學了之後會發現,原來真的很牛逼,可以嘗試用Python寫個爬蟲,GoAgent之類的。這便是進步。



扯了那麼多,就是不希望自己只懂的用Java做xx系統,只懂得用容器而永遠不知道裡面是怎樣的。這些作為根基的懂了,其他也好學。


說回資料結構這個,為什麼很多學生聽課聽得想睡,xx鏈表,雙向鏈表,我排序都有N種,學生的想法是這不知道有什麼用,你講鏈表給我,我把它實現一次,完事。


但當你生活中的編程問題需要解決的時候,你會發現到處都是資料結構的使用,像基金買入買出不是隊列嗎,先進先出;像簡單的一個班級學生的資料儲存,用個數組不就可以解決了嗎;再複雜的遊戲路線問題,這不是圖的問題嗎;Java裡面有Tree這字的,其實不也是用到樹的原理嗎?


種種下來,你會發現,原來現實問題和語言裡面的封裝,都是和這些有聯絡的,每當你學會一種,就會恍然大悟,這不就是當年西湖河畔的夏雨荷,就是這種感覺。而學生在沒有想過這些問題和沒真正去使用這些語言的封裝類之前,是不會考慮到上面所說的東西的。


所以,一大群學生趴在那裡睡覺玩手機是正常的。


後面自己意識到之後,馬上去買了《Java資料結構和演算法》,補回之前沒學和沒弄懂的。


不想學好基礎的程式員不是好的程式員。


Java資料結構與演算法

public static void main(String[] args) {
//定義當前為10
int i=10;
System.out.println("當前數為:"+getNum(i));
System.out.println("下一個數為:"+getNext(i));
}
/**
* 獲得index之後的那個樹
* @param index
* @return
*/

public static int getNext(int index){
if(index<0){
return 0;
}
return 3*(index+1)+1;
}

/**
* 獲得第index個數
* @param index
* @return
*/
public static int getNum(int index){
if(index<0){
return 0;
}
return 3*index+1;
}
 
推薦一點學習java資料結構與演算法比較經典的書籍

資料結構和演算法是和程式設計語言沒有關係的,不管你學C,C++或者java,資料結構和演算法都是一樣的。資料結構市面上書非常多,而且基本都一樣沒有大區別的,揀個清華什麼編的就成,演算法最好的是《The introduction of algorithm》,不過市面上只有影印的,沒有翻譯的。南京大學的cs系自己有本內部自己翻譯的,有同學的話去借吧。
Java經典的書基本就是《java編程思想》(Thinking in Java)和《java核心技術》JavaCore,開始看javacore的第一捲起步還是很合適的。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.