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