1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法?真的是這樣的嗎?

        共 4784字,需瀏覽 10分鐘

         ·

        2021-02-10 16:44



        什么?程序竟然等于數(shù)據(jù)結(jié)構(gòu) + 算法?

        這個公式是大師 Niklaus Wirth 在 1976 年提出來的,40 多年過去了,這個公式還成立嗎?

        對于做 Java 開發(fā)的朋友,可能會更加的贊同這個公式:

        • 程序 =?框架 + SQL


        今天,我們就來說說這些公式,我們先從 CRUD 開始說起

        做 Java 開發(fā)的朋友,大部分都知道 CRUD,也就是 Create、Retrieve、Update、Delete 四個英文單詞頭字母的縮寫,翻譯成中文就是【增刪改查】的意思

        也有很多人稱我們?Java 開發(fā)人員為【CRUD Boy】,因為我們的工作內(nèi)容一般就是面向數(shù)據(jù)庫的增刪改查,有的時候,有些人甚至還會帶著輕蔑的語氣說,你只會 CRUD 吧

        我想說的是,我只會 CRUD 怎么了?軟件開發(fā)的本質(zhì)不就是 CRUD 嗎?

        不信你來看下大神 Josh Bloch (JDK 源碼作者之一)?寫的代碼,你可以打開 JDK 的源碼,來看兩個類的源碼:

        • java.util.ArrayList?
        • java.util.LinkedList?

        這兩個類都包含常用的 add、remove、set、get 等 CRUD 的方法

        以上我們只看了大神 Josh Bloch 寫的兩個類,你看,大神寫的代碼也是離不開 CRUD 的

        你可以打開任何一個類,類的方法絕大部分是逃不過?CRUD 這四種操作

        軟件開發(fā)屬于信息技術(shù),信息技術(shù)本質(zhì)就是對數(shù)據(jù)的處理,既然要處理數(shù)據(jù),那么首先要解決數(shù)據(jù)存儲的問題,也就是將數(shù)據(jù) add 到某個地方,按照某種規(guī)則存儲起來


        當(dāng)要用數(shù)據(jù)的時候,就去存儲數(shù)據(jù)的地方,按照一定的規(guī)則查詢指定的數(shù)據(jù),有的時候還需要刪除不用的,或者要更新已經(jīng)存在的數(shù)據(jù),說白了,不就是數(shù)據(jù)的 CRUD 嗎?


        說到數(shù)據(jù)的存儲,我們都知道,數(shù)據(jù)是存儲在磁盤中的,但是為了能快速的查詢操作數(shù)據(jù),我們會將數(shù)據(jù)組織成符合查詢要求的結(jié)構(gòu),比如線性結(jié)構(gòu)、樹結(jié)構(gòu)甚至圖結(jié)構(gòu)等,這就是我們所熟知的數(shù)據(jù)結(jié)構(gòu)


        作為 Java 開發(fā),我們一般處理關(guān)系型數(shù)據(jù)的時候,都會把數(shù)據(jù)存儲在 MySQL 這種關(guān)系型數(shù)據(jù)庫中,為了提升數(shù)據(jù)庫的 CRUD 效率,關(guān)系型數(shù)據(jù)庫一般會將數(shù)據(jù)組織成像 B 樹或者 B+ 樹這種樹結(jié)構(gòu)


        有了 MySQL 后,Java 業(yè)務(wù)開發(fā)就變簡單了,我們只需要根據(jù)業(yè)務(wù)寫 SQL 了,這些 SQL 本質(zhì)上就是對數(shù)據(jù)庫,或者說是對 B 樹這種數(shù)據(jù)結(jié)構(gòu)的 CRUD 了。

        從這里我們看出,MySQL 中的數(shù)據(jù)都是組織成 B 樹這種數(shù)據(jù)結(jié)構(gòu),然后,我們寫的每個 SQL ,本質(zhì)上就是對 B 樹這種數(shù)據(jù)結(jié)構(gòu)的 CRUD,這些 CRUD 操作就是基于 B 樹這種數(shù)據(jù)結(jié)構(gòu)的算法,看到這里,你是不是會認(rèn)同程序 =?數(shù)據(jù)結(jié)構(gòu) + 算法這個公式呢?

        上面我們是站在 SQL 的角度來分析的,你可能還會問,那框架代碼呢?有了框架,我們只要簡單的使用框架給的 API 就可以了,這里也可以說程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法?

        如果我們脫去框架的華麗外衣,看看它的本質(zhì),你的眼界會得到開闊

        我們以大家熟悉的 Spring?框架來舉例,Spring 中的核心功能是 IOC,說白了就是維護(hù)對象與對象之間的引用關(guān)系,在這里,你可以將每個對象看作一個頂點(diǎn),對象與對象之間的引用看成一條邊

        而且邊是有方向的,比如對象 A?持有對象 B 的引用,那么頂點(diǎn) A 到頂點(diǎn) B 的邊的方向就是 A?--> B 了,表示對象 A 依賴于對象 B

        在一個系統(tǒng)中,會有很多的對象,對象與對象之間有依賴關(guān)系,這樣,不就形成了一個有向圖嗎?


        也就是說 Spring 管理的對象之間的關(guān)系,本質(zhì)上就是一個有向圖結(jié)構(gòu),那么 Spring 中所有的功能其實就是基于有向圖這種數(shù)據(jù)結(jié)構(gòu)之上的 CRUD 來實現(xiàn)的


        可以看出,對于框架,如果脫去華麗的外衣的話,本質(zhì)上也是數(shù)據(jù)結(jié)構(gòu) + 算法

        以上,我們是站在整個框架的層面上來看數(shù)據(jù)結(jié)構(gòu)與算法的

        實際上,對于每一個有成員變量的類來說,都是一個數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)存儲在類中的成員變量中,類中方法基本都是對成員變量中的數(shù)據(jù)進(jìn)行 CRUD,也就是說類中每個方法其實就是一個算法了

        但是,要實現(xiàn)像 Spring 這種大型的框架,需要成千上萬個類,這些類怎么組織起來呢?這就要用到設(shè)計模式來組織成千上萬個類了

        所以,在面向?qū)ο蟮氖澜缋铮@樣說可能會更加的合適:

        • 程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法 + 設(shè)計模式

        一個做 Java 開發(fā)的,做了一段時間后,如果只會:

        1. 做面向數(shù)據(jù)庫的 CRUD 的工作
        2. 調(diào)用框架提供的 API?

        那么,你很容易被以下兩種人所替代:

        1. 剛畢業(yè)的應(yīng)屆生,他們要求的薪資比較低,還喜歡干活
        2. 剛培訓(xùn)轉(zhuǎn)行 Java 的人,他們剛轉(zhuǎn)行,一開始要求也低

        我們 Java 開發(fā)只會 CRUD ,這是沒錯的,而且是好事,但是如果你只會面向某種數(shù)據(jù)庫 CRUD 的話呢,你就很容易達(dá)到瓶頸

        其實,很多人帶著輕蔑的語氣說你只會 CRUD,很多時候他說的就是你只會面向數(shù)據(jù)庫的 CRUD

        這個時候,你會想著怎么提升?

        重點(diǎn)來了,其實提升需要做到兩個方面:橫向提升?和?縱向提升

        1. 橫向提升

        對于如何橫向提升的話,我們向 JDK 源碼大師 Josh Bloch 學(xué)習(xí)就可以了。

        我們 Java 開發(fā)為什么容易達(dá)到瓶頸,其實本質(zhì)上就是因為我們只懂面向數(shù)據(jù)庫的 CRUD,或者說我們只懂面向 B 樹這一種數(shù)據(jù)結(jié)構(gòu)的 CRUD,也就是說技能太單一

        你看?JDK 源碼大師?Josh Bloch,他之所以厲害,是因為他不單單懂 B 樹的 CRUD,他還精通 ArrayList、LinkedList、HashMap、TreeMap 等各種各樣的數(shù)據(jù)結(jié)構(gòu)的 CRUD

        當(dāng)然,你想提升的話,也不要求你對所有的數(shù)據(jù)結(jié)構(gòu)的 CRUD 都精通,這也沒必要,至少你需要對一些常用的數(shù)據(jù)結(jié)構(gòu)精通,比如:數(shù)組、鏈表、棧和隊列、二叉樹、二叉查找樹、AVL 樹、紅黑樹、B 樹、哈希表、堆和優(yōu)先隊列、跳表、字典樹、圖結(jié)構(gòu)等


        所以說,你如果真想提升的話,你首先要做的就是:掌握各種各樣的常用的數(shù)據(jù)結(jié)構(gòu)的 CRUD,這樣你的視野會變得很開闊,編程能力也能得到非常大的提高,你被取代的概率就少了很多,這就是橫向提升

        掌握各種各樣的比較基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)的 CRUD?這談何容易,很多人會這么認(rèn)為的,當(dāng)然可能也包括你,就是覺得一個字:難

        但是,如果把每一個數(shù)據(jù)結(jié)構(gòu)的每個操作,拆解好了,然后再來學(xué),你還覺得難嗎?你可以體驗下下面的兩個例子

        • 第一個例子:刪除雙向鏈表中指定索引的節(jié)點(diǎn)



        • 第二個例子:平衡二叉樹 - AVL 樹中增加元素時的右旋轉(zhuǎn)操作



        除了數(shù)據(jù)結(jié)構(gòu),算法也是一個非常重要的部分,可以這么說:數(shù)據(jù)結(jié)構(gòu)與算法就是程序的靈魂了,同時也是一個 Java 程序員安身立命的核心競爭力所在

        對于算法的話,我們一定要培養(yǎng)自己的算法思維,對于程序一步一步的選擇合適的數(shù)據(jù)結(jié)構(gòu),然后達(dá)到優(yōu)化程序的目的,我們來看一個算法問題

        這個算法問題是 leetcode 里面的第 1 號算法題:兩數(shù)之和

        題目描述:
        • 給定一個整數(shù)數(shù)組 nums 和一個目標(biāo)值 target

        • 請在數(shù)組中找出和為目標(biāo)值兩個元素,并返回它們的數(shù)組下標(biāo)

        • 注意:數(shù)組中同一個元素不能使用兩次


        示例如下:

        輸入:nums = [2,7,11,15], target = 9輸出:[0,1]解釋:因為 nums[0]?+?nums[1]?==?9?,返回?[0,?1]?。

        如果上面的題目描述你沒看懂的話,可以看下面視頻解釋,如果題目你已經(jīng)懂了,下面的視頻可以跳過呢



        當(dāng)面對一個算法問題時,先嘗試使用最簡單、最暴力的解法來解決,這道算法題的暴力解法就是線性查找,看下面的視頻講解:


        當(dāng)暴力解法的時間復(fù)雜度很高的時候,我們可以嘗試對暴力解法進(jìn)行不斷的優(yōu)化,請先看使用二分查找來優(yōu)化算法:


        二分查找雖然可以優(yōu)化降低時間復(fù)雜度,但是還有一個時間復(fù)雜度更低的哈希查找,接下來我們來看看怎么使用哈希查找,進(jìn)一步降低時間復(fù)雜度:


        接下來就是追求算法的極致性能,只有這樣,才能培養(yǎng)你的算法思維,提高你的編程水平,看下面對這個算法的進(jìn)一步優(yōu)化:


        你看,對于算法,就應(yīng)該這樣去不斷的訓(xùn)練,訓(xùn)練多了,你還怕算法和數(shù)據(jù)結(jié)構(gòu)嗎?你還怕寫代碼嗎?

        如果,這樣學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),這樣刻意練習(xí)算法的話,相信,在很短的時間內(nèi),你的編程能力會提高好多個檔次的

        因為篇幅的原因,這里我也只能放一個算法的講解,更多的數(shù)據(jù)結(jié)構(gòu)與算法的學(xué)習(xí)和練習(xí),請長按下面的二維碼,然后可以查看:


        說完橫向提升,接下來,我們再來討論同等重要的縱向提升

        2. 縱向提升

        所謂縱向提升,就是針對每個常用的技術(shù),往深處學(xué)習(xí),比如 Spring、MySQL 等技術(shù)

        不管你怎么學(xué)習(xí)這些技術(shù),你永遠(yuǎn)繞不開每個技術(shù)對應(yīng)的底層數(shù)據(jù)結(jié)構(gòu)的話題

        比如你想學(xué)習(xí) MySQL 的話,你就得搞懂 B 樹或者 B+ 樹這種數(shù)據(jù)結(jié)構(gòu),對基于 B 樹或者 B+ 樹之上的算法也是需要搞懂的

        比如你想深入學(xué)習(xí) Spring,甚至說你想看 Spring 的源碼,那么你就需要對圖結(jié)構(gòu)及其算法搞懂

        我們有很多人嘗試去看 Spring 源碼,但是很多人都放棄了,因為覺得看不懂,甚至去網(wǎng)上看一些老師講源碼的視頻,但是也很難看懂,其根本的原因就是你、甚至講源碼的老師都不懂圖這種數(shù)據(jù)結(jié)構(gòu)及其算法

        可以看出,不管是橫向提升還是縱向提升,你都繞不開一個很重要的話題,那就是【數(shù)據(jù)結(jié)構(gòu)與算法】


        那么,數(shù)據(jù)結(jié)構(gòu)與算法這么重要,為什么很多人會不知道呢?

        這是一個事實

        數(shù)據(jù)結(jié)構(gòu)與算法在實際工作中的確很少會用到,這是一個事實,在平時的業(yè)務(wù)開發(fā)中,用到數(shù)據(jù)結(jié)構(gòu)與算法的地方比較少。

        雖然不得不承認(rèn),懂?dāng)?shù)據(jù)結(jié)構(gòu)與算法是很牛逼的一件事,但是,即使你不懂,也可以解決 80% 的問題。

        不利于求職

        面試中 70%?題目與數(shù)據(jù)結(jié)構(gòu)與算法有關(guān),這也是一個事實

        隨著時間的推移,企業(yè)面試越來越重視數(shù)據(jù)結(jié)構(gòu)與算法了,大廠的第一關(guān)便是算法,很多中小企業(yè),也會問上一兩道算法編程題,如果,你不會的話,基本就和工作無緣了。

        那為什么數(shù)據(jù)結(jié)構(gòu)與算法在工作中明明用不到,卻在面試中頻頻提到呢?

        首先,數(shù)據(jù)結(jié)構(gòu)與算法在面試中比較好考察,相對來說也比較公平,還可以看出這個人碼代碼的功力

        其次,解決數(shù)據(jù)結(jié)構(gòu)與算法問題的能力,同時可以反應(yīng)出一個人的思維能力,也能間接看出這個人在日后工作中,解決問題的能力、學(xué)習(xí)能力和成長潛力

        職業(yè)高度受限

        在軟件開發(fā)行業(yè),從來都是算法先行,次基礎(chǔ),技術(shù)為末。這也是程序員從業(yè)者金字塔的層級關(guān)系分布

        在數(shù)據(jù)結(jié)構(gòu)與算法知識匱乏的情況下,工作三五年之后,大約可以達(dá)到中級水平,但是很難達(dá)到高級程序員水平,導(dǎo)致你的事業(yè)發(fā)展遇到瓶頸,升不上去,這也是一個事實

        最不能接受的是,35 歲以后,你的編碼能力一定下降的,你寫代碼絕對不如 25 歲的程序員快,效率高

        這時候,如果你對于各種算法和數(shù)據(jù)結(jié)構(gòu)的認(rèn)知還是處于入門級或者中級階段的話,最終結(jié)果就是,隨著年齡的變大而不得不面對所謂的程序員中年危機(jī)了

        其實,很多人覺得數(shù)據(jù)結(jié)構(gòu)與算法很難學(xué),覺得非常遙遠(yuǎn),但是如果你跟著老湯學(xué)習(xí)的話,那么這些知識并不難的,也不遙遠(yuǎn)的:


        如果你不想只會業(yè)務(wù)開發(fā)的話,你要做的就是跟著老湯學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法:


        如果你能從大學(xué)畢業(yè),那說明,你并不比任何人差,為什么別人能學(xué)好數(shù)據(jù)結(jié)構(gòu)與算法,而你卻學(xué)不好呢?并不是因為難學(xué),最重要的原因是你沒有碰到好的老師

        來,長按掃碼,跟著老湯一步一步走,只要你是從大專及以上畢業(yè)的,你就可以學(xué)會數(shù)據(jù)結(jié)構(gòu)與算法的:

        ?? 點(diǎn)「閱讀原文」跟老湯一起拿下數(shù)據(jù)結(jié)構(gòu)與算法,就今天。

        瀏覽 45
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            精品无码人妻一区二 | 国产淫伦久久久久久久 | 妃光莉av在线 | 免费看黄色视频的网站 | 国产露脸8mav | 国产在线极品 | 女警察双腿大开呻吟警花相伴视频 | 国产精品久久久久久久7电影 | 一本一道| 日本二级黄免费在线观看 |