2018-12-25
招聘搞笑事
如果你關注招聘試題,越是大的公司,問的問題越基礎,有的甚至問你什么是棧和隊列,反而一些小公司會關心你做過什么系統,關注點不同,大公司更注重基礎扎實,發展潛力,而小公司希望你立刻、馬上為他干活,通常是沒什么技術含量的活。小公司喜歡細而長的竹子,大公司更喜歡碗口粗的竹筍。
我曾經推薦一個學生到某知名公司,沒多久,學生給我說了應聘的事情:“我介紹我開發了企業管理系統、在線商城系統等等,沒想到他問我使用了什么數據結構和算法,我懂很多技術,那么多功能我都實現了,他不問,卻問我使用了什么數據結構和算法,你說搞笑不?數據結構、算法我早就忘了,我會開發軟件還不行嗎?”人力資源總監也反饋過來意見:“很搞笑,這個學生做了不少系統,卻說根本沒用到數據結構和算法?!?/p>
既然雙方都覺得這是一個件搞笑事,我們就攤開來看,數據結構到底是什么東西。
撥云見日,看清數據結構
遇到一個實際問題,需要解決兩個事情:
(1) 如何將數據及其關系存儲在計算機中;
(2) 用什么方法策略解決問題。
前者是數據結構,后者是算法。只有數據結構沒有算法,相當于只把數據及其關系存儲到計算機中而沒有有效的方法去處理,就像一幢只有框架的爛尾樓;若只有算法,沒有數據結構,就像沙漠里的海市蜃樓,只不過是空中樓閣罷了。
數據是一切能輸入到計算機的信息總和,結構是指數據之間的關系,數據結構就是將數據及其之間的關系有效地存儲在計算機中。算法是指對特定問題求解步驟的一種描述,說白了就是解決問題的方法策略。
遇到一個實際問題,充分利用所學的數據結構,將數據及其之間的關系有效地存儲在計算機中,然后選擇合適的算法策略,并用程序高效實現。,這就是N.Wirth教授所說的:數據結構+算法=程序。
為什么要學習數據結構?
計算機專業本科生都開設數據結構課程,它是計算機學科知識結構的核心和技術體系的基石。研究生考試也是必考科目,隨著科學技術的飛速發展,數據結構的基礎性地位不僅沒有動搖,反而由于近年來算法工程師的高薪火爆,使得數據結構的重視程序空前高漲。很多人覺得基本的數據結構及操作已經在高級語言中封裝,如C++、JAVA,棧、隊列、排序、優先隊列等等,都可以直接調用庫函數,學會怎么調用就好了,干嘛要重復造輪子? 那么到底有沒有必要好好學習數據結構?
先看學習數據結構有什么用處:
(1) 學習數據有效存儲的方法
很多學生在學習數據結構時,問我要不要把單鏈表插入刪除背下來?要不合上書就不會寫了。我非常詫異,為什么要背?理工科技術知識很少需要記憶的,是用的,用的!學習知識不是死記硬背,更重要的是學習處理問題的方法。同一個問題,如何有效地存儲數據,不同的數據結構產生什么樣的算法復雜性,有沒有更好的存儲方法提高算法的效率?通過學習數據結構,更加準確和深刻地理解不同數據結構之間的共性和聯系,學會選擇和改進數據結構,高效地設計并實現各種算法,這才是數據結構的精髓。
(2) 處理具有復雜關系的數據
現實中很多具有復雜關系的數據,無法通過簡單的庫函數調用實現。如同現在很多芯片高度集成,完全不需要芯片內部如何,直接使用就行了。但是,如果在現實中遇到一個復雜問題,一個芯片只能完成其中一個功能,難道要連接十幾塊芯片來解決這一個問題?這顯然是不合適的,我們需要的是完成該復雜問題的一個芯片,因此需要運用所學的數據結構知識,高效處理具有復雜關系的數據。
數據結構為什么那么難?
網絡上太多的同學吐槽被虐,如滔滔江水連綿不絕,數據結構太難了!真的很難嗎?其實數據結構只是講了三種:線性結構、樹、圖。到底難在哪里呢?通過調查了解大概有四個原因:
(1) 無法接受的描述方式
數據結構的描述大多是抽象的形式,我們使用自然語言表達習慣了,不容易接受數據結構的抽象表示。不止一個學生問我,書上的“ElemType”到底是什么類型?運行時怎么提示錯誤。它的意思就是“元素類型”,只是這樣的描述,你需要什么類型就寫什么類型,例如int。這樣的表達方式讓不少人崩潰。
(2) 不知道什么用處
盡管很多人學習數據結構,有的人是應付考試,有的人考研需要,有的人參加算法競賽需要,而很多人不太清楚學習數據結構有什么用處,迷迷糊糊看書做題考試。
(3) 體會不到其中的妙處
由于教材、教師等等各種因素影響,很多學生沒有體會到數據結構處理數據的妙處,經常為學不會而焦頭爛額,無法體會其中樂趣,有趣是才有意思,興趣是最大的驅動力。
(4) 語言基礎不好
我一直強調先看圖解,理清思路,再上機。還是有很多同學已經理解了思路后,因為缺少main函數,輸入輸出格式不對,缺少括號等等各種語言問題卡殼,而這一切統統戴給了“數據結構太難了”這個大帽子。
數據結構學習秘籍
在講學習秘籍之前,首先了解一下數據結構學習的三種境界:
(1) 會數據結構的基本操作
這是最基礎的要求,學會各種數據結構的基本操作,取值、查找、插入、刪除等。先看圖解,理解各種數據結構的定義,操作方法,然后看代碼,嘗試自己動手上機運行,逐漸掌握基本操作。初學時,要想理解數據結構,一定要學會畫圖,通過畫圖形象表達,更能體會其中的數據結構關系。因此,初學階段學習利器:畫圖,理解,畫圖。
(2) 會利用數據結構,解決實際問題
在掌握了書上的基本操作之后,就可以嘗試利用數據結構解決一些實際問題了,先學經典應用問題的解決方法,體會數據結構的使用方法,然后再做題,獨立設計數據結構解決問題。要想熟練應用就必須做大量的題,從做題中體會其中的方法。最好進行專項練習,比如線性表問題,二叉樹問題,圖問題,該階段學習利器:做題,反思,做題。
(3) 熟練使用和改進數據結構,優化算法
這是最高境界了,也是學習數據結構的精髓所在,單獨學習數據結構是無法達到這種境界的。它需要在學習算法的過程中慢慢修煉。在學習算法的同時,逐步熟練應用、改進,慢慢體會不同數據結構和算法策略的算法復雜性,最終學會利用數據結構改進和優化算法。該階段已經在數據結構之上,通過在ACM測試系統上刷各種算法題,體會利用數據結構改進優化算法。該階段學習利器:刷題,總結,刷題。
下一篇:Linux 文件系統結構介紹
*請認真填寫需求,我們會在24小時內與您取得聯系。