重学算法第三期|数据结构与算法001
目錄
強(qiáng)烈推薦一個(gè)數(shù)據(jù)結(jié)構(gòu)可視化工具:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html,點(diǎn)擊B+樹即可模擬B+樹的動(dòng)態(tài)插入過程,非常有利于理解
1、開篇詞
2、為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法
3、如何抓住重點(diǎn),系統(tǒng)高效地學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法?
什么是數(shù)據(jù)結(jié)構(gòu)?什么是算法?
數(shù)據(jù)結(jié)構(gòu)和算法有什么關(guān)系呢?
學(xué)習(xí)的重點(diǎn)在什么地方?
學(xué)習(xí)技巧
1、開篇詞
在技術(shù)圈里,我們經(jīng)常喜歡談?wù)摳叽笊系募軜?gòu),比如高可用、微服務(wù)、服務(wù)治理等等。鮮有人關(guān)注代碼層面的編程能力,而愿意沉下心來,花幾個(gè)月時(shí)間啃一啃計(jì)算機(jī)基礎(chǔ)知識(shí)、認(rèn)認(rèn)真真夯實(shí)基礎(chǔ)的人,簡(jiǎn)直就是鳳毛麟角。
人生路上,我們會(huì)遇到很多的坎。跨過去,你就可以成長(zhǎng),跨不過去就是困難和停滯。而在后面很長(zhǎng)的一段時(shí)間里,你都需要為這個(gè)困難買單。對(duì)于我們技術(shù)人來說,更是這樣。既然數(shù)據(jù)結(jié)構(gòu)和算法這個(gè)坎,我們總歸是要跨過去,為什么不是現(xiàn)在呢?
2、為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法
我們學(xué)任何知識(shí)都是為了“用”的,是為了解決實(shí)際工作問題的,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法自然也不例外。
一名業(yè)務(wù)開發(fā)工程師,如果不知道類庫背后的原理,不懂得時(shí)間、空間復(fù)雜度分析,如何能用好、用對(duì)它們?存儲(chǔ)某個(gè)業(yè)務(wù)數(shù)據(jù)的時(shí)候,如何知道應(yīng)該用 ArrayList,還是 Linked List 呢?調(diào)用了某個(gè)函數(shù)之后,又該如何評(píng)估代碼的性能和資源的消耗呢?作為業(yè)務(wù)開發(fā),我們會(huì)用到各種框架、中間件和底層系統(tǒng),比如 Spring、RPC 框架、消息中間件、Redis 等等。在這些基礎(chǔ)框架中,一般都揉和了很多基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)和算法的設(shè)計(jì)思想。
Key-Value 數(shù)據(jù)庫 Redis 中,里面的有序集合是用什么數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)的呢?為什么要用跳表來實(shí)現(xiàn)呢?為什么不用二叉樹呢?
掌握數(shù)據(jù)結(jié)構(gòu)和算法,不管對(duì)于閱讀框架源碼,還是理解其背后的設(shè)計(jì)思想,都是非常有用的。
如何實(shí)時(shí)地統(tǒng)計(jì)業(yè)務(wù)接口的 99% 響應(yīng)時(shí)間?你可能最先想到,每次查詢時(shí),從小到大排序所有的響應(yīng)時(shí)間,如果總共有 1200 個(gè)數(shù)據(jù),那第 1188 個(gè)數(shù)據(jù)就是 99% 的響應(yīng)時(shí)間。很顯然,每次用這個(gè)方法查詢的話都要排序,效率是非常低的。但是,如果你知道“堆”這個(gè)數(shù)據(jù)結(jié)構(gòu),用兩個(gè)堆可以非常高效地解決這個(gè)問題。
有的人寫代碼的時(shí)候,從來都不考慮非功能性的需求,只是完成功能,湊合能用就好;做事情的時(shí)候,也從來沒有長(zhǎng)遠(yuǎn)規(guī)劃,只把眼前事情做好就滿足了。何為編程能力強(qiáng)?是代碼的可讀性好、健壯?還是擴(kuò)展性好?我覺得沒法列,也列不全。但是,在我看來,性能好壞起碼是其中一個(gè)非常重要的評(píng)判標(biāo)準(zhǔn)。但是,如果你連代碼的時(shí)間復(fù)雜度、空間復(fù)雜度都不知道怎么分析,怎么寫出高性能的代碼呢?
為什么學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法?我認(rèn)為有3點(diǎn)比較重要
1.直接好處是能夠有寫出性能更優(yōu)的代碼。
2.算法,是一種解決問題的思路和方法,有機(jī)會(huì)應(yīng)用到生活和事業(yè)的其他方面。
3.長(zhǎng)期來看,大腦思考能力是個(gè)人最重要的核心競(jìng)爭(zhēng)力,而算法是為數(shù)不多的能夠有效訓(xùn)練大腦思考能力的途徑之一。
3、如何抓住重點(diǎn),系統(tǒng)高效地學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法?
什么是數(shù)據(jù)結(jié)構(gòu)?什么是算法?
從廣義上講,數(shù)據(jù)結(jié)構(gòu)就是指一組數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)。算法就是操作數(shù)據(jù)的一組方法。圖書館儲(chǔ)藏書籍你肯定見過吧?為了方便查找,圖書管理員一般會(huì)將書籍分門別類進(jìn)行“存儲(chǔ)”。按照一定規(guī)律編號(hào),就是書籍這種“數(shù)據(jù)”的存儲(chǔ)結(jié)構(gòu)。那我們?nèi)绾蝸聿檎乙槐緯?#xff1f;有很多種辦法,你當(dāng)然可以一本一本地找,也可以先根據(jù)書籍類別的編號(hào),是人文,還是科學(xué)、計(jì)算機(jī),來定位書架,然后再依次查找。籠統(tǒng)地說,這些查找方法都是算法。
從狹義上講,也就是我們專欄要講的,是指某些著名的數(shù)據(jù)結(jié)構(gòu)和算法,比如隊(duì)列、棧、堆、二分查找、動(dòng)態(tài)規(guī)劃等
數(shù)據(jù)結(jié)構(gòu)和算法有什么關(guān)系呢?
數(shù)據(jù)結(jié)構(gòu)和算法是相輔相成的。數(shù)據(jù)結(jié)構(gòu)是為算法服務(wù)的,算法要作用在特定的數(shù)據(jù)結(jié)構(gòu)之上。 因此,我們無法孤立數(shù)據(jù)結(jié)構(gòu)來講算法,也無法孤立算法來講數(shù)據(jù)結(jié)構(gòu)
學(xué)習(xí)的重點(diǎn)在什么地方?
學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的過程,是非常好的思維訓(xùn)練的過程,所以,千萬不要被動(dòng)地記憶,要多辯證地思考,多問為什么。如果你一直這么堅(jiān)持做,你會(huì)發(fā)現(xiàn),等你學(xué)完之后,寫代碼的時(shí)候就會(huì)不由自主地考慮到很多性能方面的事情,時(shí)間復(fù)雜度、空間復(fù)雜度非常高的垃圾代碼出現(xiàn)的次數(shù)就會(huì)越來越少。你的編程內(nèi)功就真正得到了修煉
學(xué)習(xí)技巧
?
?
?
總結(jié)
以上是生活随笔為你收集整理的重学算法第三期|数据结构与算法001的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DDR3 MIG IP核仿真与学习
- 下一篇: 代数-导学