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