第一章 介紹,
數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)專業(yè)的同學(xué)必學(xué)的課程
數(shù)據(jù)結(jié)構(gòu)研究的是數(shù)據(jù)如何在計(jì)算機(jī)進(jìn)行組織和存儲(chǔ),使得我們可以高效的獲取數(shù)據(jù)或者修改數(shù)據(jù)。
數(shù)據(jù)結(jié)構(gòu)可以分為三種結(jié)構(gòu):
線性結(jié)構(gòu):
數(shù)組;棧;隊(duì)列;鏈表;哈希表
樹結(jié)構(gòu):
二叉樹,二分搜索樹,AVL,紅黑樹,Treap,Splay,堆,Trie,線段樹,K-D樹,并查集,哈夫曼樹
圖結(jié)構(gòu)
鄰接矩陣,鄰接表
我們需要根據(jù)應(yīng)用的不同,靈活選擇最合適的數(shù)據(jù)結(jié)構(gòu),
例子:
1,數(shù)據(jù)庫(kù),
它已經(jīng)封裝好了,使用SQL語(yǔ)言就可以使用數(shù)據(jù)庫(kù),
SELECT * FROM 慕課網(wǎng)
WHERE interest = "數(shù)據(jù)結(jié)構(gòu)"
里面最重要的是使用樹結(jié)構(gòu):AVL,紅黑樹,Treap,伸展樹,B樹,
還有很重要的哈希表
2,操作系統(tǒng)
涉及非常多的數(shù)據(jù)結(jié)構(gòu),1個(gè)例子,多任務(wù)切換,涉及:
系統(tǒng)棧,遞歸調(diào)用就需要系統(tǒng)棧
優(yōu)先隊(duì)列:堆。 有了優(yōu)先隊(duì)列,操作系統(tǒng)才可以快速在多個(gè)任務(wù)之間比較他們的優(yōu)先級(jí),實(shí)現(xiàn)任務(wù)的切換
3,文件壓縮
不只是RAR,計(jì)算機(jī)中的PNG,MP3,PDF都是對(duì)不同的文件進(jìn)行了一定的壓縮處理,
最基礎(chǔ)的壓縮算法使用的是哈夫曼樹,
哈夫曼樹很簡(jiǎn)單,現(xiàn)在軟件已經(jīng)不用了
4,通訊錄,
當(dāng)時(shí)使用的鏈表,但是聯(lián)系人非常多時(shí),查找特別慢,
最后這個(gè)問(wèn)題被實(shí)習(xí)生解決,方法很簡(jiǎn)單,
Trie,前綴樹。
這樣,在通訊錄查找任何人都是ms級(jí)別,不管你有多少聯(lián)系人
大量的算法,以數(shù)據(jù)結(jié)構(gòu)為基石
如,游戲中的尋路算法,是圖論算法,
DFS深度優(yōu)先遍歷:使用棧,
BFS廣度優(yōu)先遍歷:使用隊(duì)列
數(shù)據(jù)結(jié)構(gòu)+算法 = 程序
課程設(shè)置
不需要任何數(shù)據(jù)結(jié)構(gòu)基礎(chǔ),但是需要java語(yǔ)言的基礎(chǔ),
選擇java是因?yàn)閖ava的推廣度高,大多數(shù)同學(xué)都會(huì),
java是完全面向?qū)ο蟮模浅_m合進(jìn)行底層數(shù)據(jù)結(jié)構(gòu)的研究,
鏈表,隊(duì)列,棧,哈希表,都是一個(gè)名詞,然后對(duì)名詞賦予不同的操作,這非常符合面向?qū)ο蟮脑瓌t。
所以不僅可以掌握數(shù)據(jù)結(jié)構(gòu),還可以對(duì)面向?qū)ο蟮脑O(shè)計(jì)有更深入的理解,
C++ PHP swift Python,都支持面向?qū)ο?,都可以自己去?br />
課程包含:
數(shù)組,棧,隊(duì)列,鏈表,
二分搜索樹,堆,線段樹,Trie
并查集,AVL,紅黑樹,哈希表,
不包含圖結(jié)構(gòu),因?yàn)榇鎯?chǔ)圖非常簡(jiǎn)單,線性表就可以,
但是圖論領(lǐng)域非常龐大,以算法為主,
基礎(chǔ)的結(jié)構(gòu),也不能忽視,如:
遞歸,如何調(diào)試,復(fù)雜度分析,
手把手的學(xué)習(xí)底層的實(shí)現(xiàn),完成后可以向更加復(fù)雜的數(shù)據(jù)結(jié)構(gòu)進(jìn)軍,
并不是實(shí)現(xiàn)了就結(jié)束了,對(duì)于每個(gè)數(shù)據(jù)結(jié)構(gòu)背后的思考,為什么有他們,如何優(yōu)化,比較,
三個(gè)層次:
1,面向面試:
數(shù)組,棧,隊(duì)列,鏈表,二分搜索樹,堆,
最簡(jiǎn)單,是面試筆試的???,要達(dá)到手寫代碼的程序,
2,面向競(jìng)賽:
線段樹,Trie,并查集,
這是競(jìng)賽的常客
講一些LeetCode典型,
最后,AVL,紅黑樹,哈希表,
AVL和紅黑樹本身都是平衡二叉樹的實(shí)現(xiàn),
哈希表是非常常用的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
放在最后是因?yàn)樗麄儽容^復(fù)雜,代碼量大一些
面試時(shí)不要求實(shí)現(xiàn)他們,都是概念和性能分析上的問(wèn)題,
如紅黑樹書平衡的但是不是完全平衡的,所以有很多和性能分析相關(guān)的問(wèn)題,
哈希表和沖突檢測(cè)相關(guān)就有很多性能分析問(wèn)題
本課程會(huì)從基層開始寫, 一般很難這樣講
===================
1-2 ,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)有沒(méi)有用?
為什么在工作中用不到數(shù)據(jù)結(jié)構(gòu)和算法?
工作中用不到數(shù)據(jù)結(jié)構(gòu)和算法,所以他們沒(méi)用?
考碩士博士一定要數(shù)據(jù)結(jié)構(gòu)和算法,所以他們只是為了應(yīng)付面試和考試?
沒(méi)用:
現(xiàn)代軟件開發(fā)過(guò)程越來(lái)越簡(jiǎn)單,如IOS開發(fā)者,使用IOS,使用Swift語(yǔ)言,使用Xcode開發(fā)工具,
IOS開發(fā)者對(duì)他們的細(xì)節(jié)一無(wú)所知,使用接口就可以了,
不需要任何數(shù)據(jù)結(jié)構(gòu)算法知識(shí),就能開發(fā)一個(gè)很好的APP,
所以開發(fā)APP的門檻越來(lái)越低,蘋果也希望這樣,
所以如果只是使用工具構(gòu)建出屬于我們自己的網(wǎng)站或者APP,是越來(lái)越簡(jiǎn)單的,在技術(shù)上,
可能以后,這部分工作都不需要計(jì)算機(jī)專業(yè)的同學(xué)來(lái)做,
計(jì)算機(jī)專業(yè)的同學(xué),關(guān)注的是上面的加粗,里面包含更多的智力勞動(dòng),
底層操作系統(tǒng),數(shù)據(jù)庫(kù),語(yǔ)言,開發(fā)環(huán)境,各種框架,
開發(fā)他們會(huì)使用大量的框架,
這些都是大公司做的,所以
越大的公司,越需要同學(xué)有扎實(shí)的數(shù)據(jù)結(jié)構(gòu)和算法功底
隨著產(chǎn)品龐大,功能變多,開發(fā)者不僅要解決功能需求問(wèn)題,還要解決計(jì)算機(jī)科學(xué)的問(wèn)題,這是數(shù)據(jù)結(jié)構(gòu)和算法就發(fā)揮巨大作用
學(xué)好數(shù)據(jù)結(jié)構(gòu),會(huì)大大提高技術(shù)上限,可以走的更遠(yuǎn),
如果你想在計(jì)算機(jī)技術(shù)走的更遠(yuǎn),就必須學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),
=====================
1-3
這門玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu),與那個(gè)166的有什么區(qū)別?
區(qū)別很大,這門課程,是以數(shù)據(jù)結(jié)構(gòu)為主線的,這節(jié)課將的數(shù)據(jù)結(jié)構(gòu)和那個(gè)課幾乎是不重疊的,
而且重復(fù)的點(diǎn),講解也有所不同,
166的課涉及各種排序,快速排序,堆排序,圖算法,
166的課用C++講解,雖然也提供了完整的java代碼,
但是我意識(shí)到很多同學(xué)都用的是java,所以用完全面向?qū)ο蟮膉ava更好,
關(guān)于腳本語(yǔ)言:JS,Python,
這種非編譯型的語(yǔ)言,依靠解析器在運(yùn)行時(shí)進(jìn)行解釋的語(yǔ)言
腳本語(yǔ)言可以用來(lái)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的原理,但不適合 考察數(shù)據(jù)結(jié)構(gòu)和算法的性能,
性能不僅僅和邏輯相關(guān),還非常依賴于其解析器對(duì)不同寫法的解析的不同,
如,對(duì)于python,寫出pythonic的寫法可能比邏輯本身更重要,
如:
//類java的寫法:
arr = []
for i in range(10):
arr.append(i)
python中 可以用生成表達(dá)式:
arr = [i for i in range(10)]
但是兩種寫法不僅是代碼數(shù)量的區(qū)別,下面的寫法性能遠(yuǎn)遠(yuǎn)優(yōu)于上面的寫法
所以對(duì)于腳本語(yǔ)言,不僅關(guān)注邏輯,還關(guān)注語(yǔ)法,
所以對(duì)于學(xué)習(xí),不希望兩者都關(guān)注,
像C++ java是更好的學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的語(yǔ)言,
java運(yùn)行在JVM上,可能也涉及一些這個(gè)問(wèn)題,但可以忽略
好的問(wèn)題,有你的思考在里面,
詳細(xì)說(shuō)明,哪個(gè)地方出了問(wèn)題,你的思考是什么?認(rèn)為應(yīng)該有怎么的結(jié)果,實(shí)際卻得到了怎么樣的輸出?
數(shù)據(jù)結(jié)構(gòu)只是面試的一部分,甚至只是算法面試的一部分,
如排序算法,二分搜索算法,回溯算法,貪心算法,這個(gè)可以看玩轉(zhuǎn)算法面試,
但是那些課不會(huì)涉及底層實(shí)現(xiàn),如哈希表就拿來(lái)直接用,
算法競(jìng)賽非常廣泛,深度也高,
圖論,計(jì)算幾何,組合數(shù)學(xué),概率論,等進(jìn)行考察
========
1-4
java 8,是最穩(wěn)定版本
現(xiàn)在已經(jīng)退出了java 10,由于java 8是普遍使用的,所以建議用它,
課程代碼本身對(duì)java語(yǔ)言版本沒(méi)有太多要求,用不上太多java的新特性,java 6以后都沒(méi)問(wèn)題,
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺(tái),網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對(duì)作者和來(lái)源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請(qǐng)及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對(duì)此聲明的最終解釋權(quán)。