如何學好數據結構與算法(視頻+文字版)

如何學好數據結構與算法

視頻地址:https://www.bilibili.com/video/BV1Jp4y1X72Q/

文字版:

陳小玉

《趣學數據結構》《趣學算法》作者

主題:

  1. 爲什麼要學數據結構
  2. 數據結構學習祕籍
  3. 算法爲什麼那麼難
  4. 算法學習祕籍
  5. 如何打開數據結構與算法這兩扇門

隨着科學技術的發展,人工智能已滲透到各個行業,算法工程師非常火爆,急缺大量人才,年薪也越來越高。剛畢業30-40萬很常見。很多人想入手學習算法,那麼多算法,究竟該如何下手呢?

很多人看到招聘要求,算法工程師有很多具體分支:

/視頻算法工程師

圖像處理算法工程師

信號算法工程師

自然語言算法工程師

數據挖掘算法工程師

搜索算法工程師

例如有的招聘要求:

1.至少熟悉一門編程語言C/C++/java/python/R

2.熟練掌握數據結構,具有良好的算法基礎和編程功底;

/熟練運用各種常用算法和數據結構,有獨立的實現能力;

3.熟悉數據挖掘算法

4.熟悉機器學習相關知識理論

加分項:具有較爲豐富的項目實踐經驗

那麼是不是要直接學習這些算法呢?

其實不然,萬丈高樓平地起,任何高深的算法都要從基礎算法學起,不可能一口喫個胖子,所以入門算法還是要從基礎開始:

  1. 首先學習一門語言,例如C/C++/Java/python,初學者學C++比較普遍。
  2. 學數據結構,數據結構書有很多,但是有些教材晦澀難懂,建議看圖解多,通俗易懂的書,推薦《趣學數據結構》。
  3. 學算法,不要直接看《算法導論》,大量證明會讓你崩潰。推薦《趣學算法》,有問題分析,完美圖解,僞碼詳解,實戰演練,適合初學者快速掌握經典算法。
  1. 爲什麼要學數據結構?

招聘搞笑事

如果你關注招聘試題,越是大的公司,問的問題越基礎,有的甚至問你什麼是棧和隊列,反而一些小公司會關心你做過什麼系統,關注點不同,大公司更注重基礎紮實,發展潛力,而小公司希望你立刻、馬上爲他幹活,通常是沒什麼技術含量的活。小公司喜歡細而長的竹子,大公司更喜歡碗口粗的竹筍。

我曾經推薦一個學生到某知名公司,沒多久,學生給我說了應聘的事情:“我介紹我開發了企業管理系統、在線商城系統等等,沒想到他問我使用了什麼數據結構和算法,我懂很多技術,那麼多功能我都實現了,他不問,卻問我使用了什麼數據結構和算法,你說搞笑不?數據結構、算法我早就忘了,我會開發軟件還不行嗎?”人力資源總監也反饋過來意見:“很搞笑,這個學生做了不少系統,卻說根本沒用到數據結構和算法。”

既然雙方都覺得這是一個件搞笑事,我們就攤開來看,數據結構到底是什麼東西。

撥雲見日,看清數據結構

遇到一個實際問題,需要解決兩個事情:

1 如何將數據存儲在計算機中;

2 用什麼方法策略解決問題。

前者是數據結構,後者是算法。只有數據結構沒有算法,相當於只把數據存儲到計算機中而沒有有效的方法去處理,就像一幢只有框架的爛尾樓;若只有算法,沒有數據結構,就像沙漠裏的海市蜃樓,只不過是空中樓閣罷了。

數據是一切能輸入到計算機的信息總和,結構是指數據之間的關係,數據結構就是將數據及其之間的關係有效地存儲在計算機中。算法是指對特定問題求解步驟的一種描述,說白了就是解決問題的方法策略。數據結構和算法不依賴於語言,什麼語言無所謂。但是如果上機實現的話,就要使用計算機語言。

遇到一個實際問題,充分利用所學的數據結構,將數據及其之間的關係有效地存儲在計算機中,然後選擇合適的算法策略,並用程序高效實現,這就是N.Wirth教授所說的:數據結構+算法=程序

爲什麼要學習數據結構?

計算機專業本科生都開設數據結構課程,它是計算機學科知識結構的核心和技術體系的基石。研究生考試也是必考科目,隨着科學技術的飛速發展,數據結構的基礎性地位不僅沒有動搖,反而由於近年來算法工程師的高薪火爆,而得到了業內空前的重視。很多人覺得基本的數據結構及操作已經在高級語言(如C++JAVA語言中)中封裝,棧、隊列、排序、優先隊列等都可以直接調用庫函數,學會怎麼調用就好了,幹嘛要重複造輪子? 那麼到底有沒有必要好好學習數據結構?

先看學習數據結構有什麼用處

1 學習數據有效存儲的方法

很多學生在學習數據結構時,問我要不要把單鏈表插入刪除代碼背下來?要不合上書就不會寫了。我非常詫異,爲什麼要背?理工科技術知識很少需要記憶的,是用的,用的!學習知識不是死記硬背,更重要的是學習處理問題的方法。同一個問題,如何有效地存儲數據,不同的數據結構產生什麼樣的算法複雜性,有沒有更好的存儲方法提高算法的效率?例如,用順序表查找需要O(n)的時間複雜度,用平衡樹查找需要O(logn)的時間複雜度。這是什麼概念呢?就像你有10個億,一覺醒來,兜裏只剩下30塊!

2 處理具有複雜關係的數據

現實中很多具有複雜關係的數據,無法通過簡單的庫函數調用實現。專業認證中特別強調培養學生解決複雜工程問題的能力,什麼是複雜工程問題?就是需要綜合運用多個知識技術解決的問題。如同現在很多芯片高度集成,完全不需要芯片內部如何,直接使用就行了。但是,如果在現實中遇到一個複雜問題,一個芯片只能完成其中一個功能,難道要連接十幾塊芯片來解決這一個問題?你在搞聖誕樹嘛?一個樹枝掛個小禮物,叮叮噹噹的亂響。這顯然是不合適的,我們需要的是完成該複雜問題的一個芯片,因此需要運用所學的數據結構知識,高效處理具有複雜關係的數據。

通過學習數據結構,更加準確、深刻地理解不同數據結構之間的共性和聯繫,學會選擇和改進數據結構,高效地設計並實現各種算法,這纔是數據結構的精髓。

  1. 數據結構學習祕籍

數據結構爲什麼那麼難?

網絡上太多的同學吐槽被虐,如滔滔江水連綿不絕,數據結構太難了!真的很難嗎?其實數據結構只是講了三種:線性結構、樹、圖。到底難在哪裏呢?通過調查瞭解大概有四個原因:

1 無法接受的描述方式

數據結構的描述大多是抽象的形式,我們使用自然語言表達習慣了,不容易接受數據結構的抽象表示。不止一個學生問我,書上的“ElemType”到底是什麼類型?運行時怎麼提示錯誤。它的意思就是元素類型,只是這樣的描述,你需要什麼類型就寫什麼類型,例如int。這樣的表達方式讓不少人崩潰。

2 不知道什麼用處

儘管很多人學習數據結構,有的人是應付考試,有的人考研需要,有的人蔘加算法競賽需要,而很多人不太清楚學習數據結構有什麼用處,迷迷糊糊看書、做題、考試。

3 體會不到其中的妙處

由於教材、教師等等各種因素影響,很多學生沒有體會到數據結構處理數據的妙處,經常爲學不會而焦頭爛額,無法體會其中樂趣,有趣是纔有意思,興趣是最大的驅動力。一旦體會到其中的奧妙,就會有停不下來的感覺。有讀者給我留言,老師看了你的書根本停不下來。其實,我寫書的時候也停不下來,神同步。

4 語言基礎不好

我一直強調先看圖解,理清思路,再上機。還是有很多同學已經理解了思路後,因爲缺少main函數,輸入輸出格式不對,缺少括號等等各種語言問題卡殼,而這一切統統戴給了數據結構太難了這個大帽子。

數據結構學習祕籍

在講學習祕籍之前,首先了解一下數據結構學習的三種境界:

1 會數據結構的基本操作

這是最基礎的要求,學會各種數據結構的基本操作,取值、查找、插入、刪除等。先看圖解,理解各種數據結構的定義,操作方法,然後看代碼,嘗試自己動手上機運行,逐漸掌握基本操作。初學時,要想理解數據結構,一定要學會畫圖,通過畫圖形象表達,更能體會其中的數據結構關係。因此,初學階段學習利器:畫圖,理解,畫圖。

2 會利用數據結構,解決實際問題

在掌握了書上的基本操作之後,就可以嘗試利用數據結構解決一些實際問題了,先學經典應用問題的解決方法,體會數據結構的使用方法,然後再做題,獨立設計數據結構解決問題。要想熟練應用就必須做大量的題,從做題中體會其中的方法。最好進行專項練習,比如線性表問題,二叉樹問題,圖問題,該階段學習利器:做題,反思,做題。

3 熟練使用和改進數據結構,優化算法

這是最高境界了,也是學習數據結構的精髓所在,單獨學習數據結構是無法達到這種境界的。它需要在學習算法的過程中慢慢修煉。在學習算法的同時,逐步熟練應用、改進,慢慢體會不同數據結構和算法策略的算法複雜性,最終學會利用數據結構改進和優化算法。該階段已經在數據結構之上,通過在測試系統上刷各種算法題,體會利用數據結構改進優化算法。該階段學習利器:刷題,總結,刷題。

刷題網站:打比賽HDUPOJVjudgeCode Forces,找工作LeetCode

  1. 算法爲什麼那麼難

很多人感嘆:算法爲什麼那麼難

首先,算法本身具有一定的複雜性,還有一個原因:講的太爛!

算法的教與學有兩個困難:

1)我們學習了那些經典的算法,在驚歎它們奇思妙想的同時,難免疑慮重重:這麼牛,怎麼想到的?對學生來說,這可能是最費解、也最讓人窩火的地方。高手講,學算法要學它的來龍去脈,包括種種證明。但這對菜鳥來說,簡直比登天還難,很可能花費很多時間也無法搞清楚。這條路對大多數人來說,是行不通的,那怎麼辦呢?下功夫去記憶書上的算法?記住這些算法的效率?看似學會了,其實兩手空空。遇到一個新問題,仍然無從下手。可這偏偏又是極重要的,無論作研究還是實際工作,一個計算機專業人士最重要的能力,就是解決問題——解決那些不斷從實際應用中冒出來的新問題。

2)算法作爲一門學問,有兩條几乎平行的線索。一個是數據結構(數據對象):數、矩陣、集合、串、排列、圖、表達式、分佈等等。另一個是算法策略:貪心、分治、動態規劃、線性規劃、搜索等等。這兩條線索是相互獨立的:同一個數據對象(例如圖)上有不同的問題,例如單源最短路徑和最優二叉樹,就可以用到不同的算法策略,如貪心和動態規劃;而同一個算法策略,例如排序和整數乘法,也會用到不同的數據結構。它們之間是多對多的關係。

兩條線索交織在一起,該如何表述?

我們早已習慣《數據結構》中講數據結構,《算法設計與分析》裏面講算法策略。各說各的,講算法設計時就假設你已經對數據結構瞭如指掌,還沒有哪一本算法書很好的解決這兩個困難,傳統的算法書,大多注重內容的收錄,但卻忽視思維過程的展示,因此我們學習了經典的算法,卻費解於算法設計的過程。遇到一個實際問題,通過問題分析,選擇使用什麼樣的算法策略,基於這種算法策略選擇什麼樣的數據結構,有時算法策略和數據結構的選擇並不是唯一的,不同的算法策略和數據結構設計的算法,其複雜性是不同的。而很多書就是灌輸式的講一個實例,一下子就選擇了一個認定是最優的算法策略,告訴你就這樣幹,不談數據結構,然後分析算法複雜性,就結束了。原則上講算法策略就講算法策略,不依賴任何程序設計語言和數據結構,但對很多學生來講,尤其是語言沒學好,數據結構也不熟練的同學,只講算法策略,如同空中樓閣。自己用算法解決實際問題,一頭霧水。

《趣學算法》,從問題出發,根據實際問題進行分析,選擇合適的算法策略,並分析爲什麼採用這種算法策略,然後選擇什麼數據結構,不同的數據結構複雜性會有什麼區別,巧妙地將數據結構和算法策略擰成了一條線。通過大量實例,充分展現算法設計的思維過程,讓學生充分體會遇到一個問題,如何分析,使用什麼算法策略,採用什麼數據結構,算法的複雜性如何?是否有優化的可能?

西方教育旨在激發學生對世界的好奇心,而在這裏,我們培養的是讓學生懷着一顆好奇心,思考問題、解決問題的能力。更重要的是——體會學習的樂趣,發現算法的美!

  1. 算法學習祕籍

知識在於積累,學習需要耐力。學習就像挖金礦,或許一開始毫無頭緒,一頭霧水,但轉個角度,換換工具,時間久了總會找到一個縫隙。成功就是你比別人多走了一段路,或許恰恰是那麼一小步。

第一個建議:多角度,對比學習

學習算法,可以先閱讀一本簡單的入門書,然後綜合幾本書橫向多角度看,例如學習動態規劃,拿幾本算法書,把動態規劃這章找出來,比較學習,多角度對比分析更清晰,或許你會恍然大悟,噢,原來如此簡單。或許有同學說我哪有那麼多錢買那麼多書,只要你想學習,沒有什麼可以阻擋!你可以圖書館借,也可以聯繫你的老師,每學期上課前,我都會告訴學生,如果你想學習卻沒錢買書,我可以提供幫助。想一想,你真的沒有辦法?

第二個建議:大視野,不求甚解

經常有學生爲了一個公式推導,或幾句代碼拋錨,甚至停滯數日,然後淹沒在無盡的挫敗感中,把自己弄得垂頭喪氣。公式可以不懂,代碼可以不會。你不必投入大量精力試圖推導書上的每一個公式,也不必探究語法或技術細節。學算法就是學算法本身,首先是算法思想,解題思路,然後是算法實現,算法思想的背後可能有高深的數學模型,複雜的公式推導,你理解了當然玄妙,不懂就拉倒。算法實現可以用任何語言,所以不必糾結是CC++JavaPython,更不必管嚴格的語法規則,除非你要上機調試。建議還是先領會算法,寫僞代碼,在大腦中調試吧,如果沒有良好的編程經驗,一開始就上機或許更讓你崩潰。遇到不懂的部分,瀏覽一下或跳過去,讀完了還不明白再翻翻別的書,總有一天,你會發現,“暮然回首,那人卻在燈火闌珊處”。

第三個建議:多交流,見賢思齊

與同學,朋友,教師或其他編程愛好者們一起學習和討論問題,是取得進步最有效的辦法,也是分享知識和快樂的途徑。加入論壇,加入交流羣,會了解其它人在做什麼,怎麼做,遇到問題可以請教高手,帶來醍醐灌頂的喜悅;也可以應助菜鳥,使你暗自得意,信心倍增。論壇和羣也會分享大量的學習資料和視頻,還有不定期的培訓講座,讀書交流會,你會發現,不是你一個人在戰鬥!

第四個建議:勤實戰,越挫越勇

實踐是檢驗一切真理的標準。古人云:“學以致用”,“師夷長技以制夷”。請不要急切期盼“實際的”例子,更不要看不起小實例,“不積跬步,無以至千里”。大規模的成功商業案例所採用的算法,人工情感,無人駕駛,不是我們目前要解決的問題。看清楚腳下的路,比仰望天空更實際,多做一些實戰練習,更好地體會算法的本質,在錯誤中不斷成長,越挫越勇,終究會成參天大樹。

第五個建議:看電影,洞察未來

不管是講《人工智能》,還是《算法分析》,我都會建議同學們去看一看科幻電影,如《人工智能》、《記憶裂痕》、《絕密飛行》、《未來戰士》、《她》等等。奇妙的是,這些科幻的東西,正在一步步的實現,靠的是什麼?人工智能。計算機的終極是人工智能,人工智能的核心是算法。未來的戰爭是科技的戰爭,先進的科技需要人工智能。我們的國家還有很多技術落後,未來需要你。

“一心兩本”學習法:一顆好奇心,兩個記錄本。

懷着一顆好奇心去學習,才能不斷的解決問題,獲得滿足感,體會算法的美。很多科學大牛的祕訣就是永遠保持一顆好奇心;一個記錄本用來記錄學習重點難點,隨時的突發奇想;一個記錄本做日記或週記,記錄一天或一週來學了什麼,有什麼經驗教訓,需要注意什麼,計劃下一天或下一週做什麼。不停的總結反思過去,計劃未來,這樣每天都有事做,心中滿滿的能量。一個人經常上課睡覺,因爲他心中無事可做;一個人經常失眠,因爲他心裏事兒太多!

  1. 如何打開數據結構和算法這兩扇門

推薦給大家的兩本入門書:《趣學數據結構》和《趣學算法》

推薦這本書的三大理由:

1完美圖解+豐富實例,複雜問題簡單化

爲基本操作配以圖解,用數據結構解決生活中的實際問題,學習過程更加輕鬆有趣。

2原理分析+實戰演練,真正地學以致用

通俗化講解基礎知識,在實戰中體會數據結構的設計和操作,鍛鍊獨立思考的能力。

3配套代碼+在線答疑,爲學習保駕護航

提供書中的範例程序源代碼、練習題以及答案解析,並在博客和QQ羣中答疑解惑。

內容簡介

本書基於C++語言編寫,從趣味故事引入算法複雜性計算及數據結構基礎內容,涵蓋線性結構、樹形結構和圖形結構,包括鏈表、棧和隊列、樹和圖的應用等。本書內容還涉及數據結構的基本應用(包括各種查找、排序等)和高級應用(包括優先隊列、並查集、B-樹、B+樹和紅黑樹等)。通過大量圖解將抽象數據模型簡單通俗化,語言表述淺顯易懂,並結合有趣的實例幫助讀者輕鬆掌握數據結構。

適讀人羣 本書可作爲程序員的學習用書,也適合沒有太多編程經驗但又對數據結構有強烈興趣的初學者使用,同時也可作爲高等院校計算機、數學及相關專業的師生用書,或學科競賽的輔導用書和培訓學校的教材。

 

選擇這本書的六大理由:

1實例豐富,通俗易懂。從有趣的故事引入算法,從簡單到複雜,使讀者從實例中體會算法設計思想。實例講解通俗易懂,讓讀者獲得最大程度的啓發,鍛鍊分析問題和解決問題的能力。

2完美圖解,簡單有趣。結合大量完美繪圖,對算法進行分解剖析,使複雜難懂的問題變得簡單有趣,給讀者帶來巨大的閱讀樂趣,使讀者在閱讀中不知不覺地學到算法知識,體會算法的本質。

3深入淺出,透析本質。採用僞代碼描述算法,既簡潔易懂,又能抓住本質,算法思想描述及註釋使代碼更加通俗易懂。對算法設計初衷和算法複雜性的分析全面細緻,既有逐步得出結論的推導過程,又有直觀的繪圖展示。

4實戰演練,循序漸進。每一個算法講解清楚後,進行實戰演練,使讀者在實戰中體會算法,增強自信,從而提高讀者獨立思考和動手實踐的能力。豐富的練習題和思考題用於及時檢驗讀者對所學知識掌的握情況,爲讀者從小問題出發到逐步解決大型複雜性問題奠定了基礎。

5算法解析,優化拓展。每一個實例都進行了詳細的算法解析,分析算法的時間複雜度和空間複雜度,並對其優化拓展進一步討論,提出了改進算法,並進行僞碼講解和實戰演練,最後分析優化算法的複雜度進行對比。使讀者在學習算法的基礎上更上一個階梯,對算法優化有更清晰的認識。

6網絡資源,技術支持。網絡提供本書所有範例程序的源代碼、練習題以及答案解析,這些源代碼可以自由修改編譯,以符合讀者的需要。本書提供源代碼執行、調試說明書,對讀者存在的問題提供技術支持。

內容簡介:

按照算法策略分爲7章。

1章從算法之美、簡單小問題、趣味故事引入算法概念、時間複雜度、空間複雜度的概念和計算方法,以及算法設計的爆炸性增量問題,使讀者體驗算法的奧妙。

27章介紹經典算法的設計策略、實戰演練、算法分析及優化拓展,分別講解貪心算法、分治算法、動態規劃、回溯法、分支限界法、線性規劃和網絡流。每一種算法都有410個實例,共50個大型實例,包括經典的構造實例和實際應用實例,按照問題分析、算法設計、完美圖解、僞代碼詳解、實戰演練、算法解析及優化拓展的流程,講解清楚且通俗易懂。附錄介紹常見的數據結構及算法改進用到的相關知識,包括sort函數、優先隊列、鄰接表、並查集、四邊不等式、排列樹、貝爾曼規則、增廣路複雜性、最大流最小割等。

本書可作爲程序員的學習用書,也適合從未有過編程經驗但又對算法有強烈興趣的初學者使用,同時也可作爲高等院校計算機、數學及相關專業的師生用書和培訓學校的教材。

最後,以兩本書的簽名結束本次交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章