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