<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          程序 = 數(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】,因?yàn)槲覀兊墓ぷ鲀?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í)就是基于有向圖這種數(shù)據(jù)結(jié)構(gòu)之上的 CRUD 來實(shí)現(xiàn)的


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

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

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

          但是,要實(shí)現(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á)到瓶頸

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

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

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

          1. 橫向提升

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

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

          你看?JDK 源碼大師?Josh Bloch,他之所以厲害,是因?yàn)樗粏螁味?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é),你還覺得難嗎?你可以體驗(yàn)下下面的兩個例子

          • 第一個例子:刪除雙向鏈表中指定索引的節(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]解釋:因?yàn)?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),你的編程能力會提高好多個檔次的

          因?yàn)槠脑颍@里我也只能放一個算法的講解,更多的數(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 源碼,但是很多人都放棄了,因?yàn)橛X得看不懂,甚至去網(wǎng)上看一些老師講源碼的視頻,但是也很難看懂,其根本的原因就是你、甚至講源碼的老師都不懂圖這種數(shù)據(jù)結(jié)構(gòu)及其算法

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


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

          這是一個事實(shí)

          數(shù)據(jù)結(jié)構(gòu)與算法在實(shí)際工作中的確很少會用到,這是一個事實(shí),在平時的業(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),這也是一個事實(shí)

          隨著時間的推移,企業(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ā)展遇到瓶頸,升不上去,這也是一個事實(shí)

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

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

          其實(shí),很多人覺得數(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é)不好呢?并不是因?yàn)殡y學(xué),最重要的原因是你沒有碰到好的老師

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

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

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠人妻久久 | 翔田千里无码AV在线观看 | 狠操网| 欧美手机精品在线 | 天天操69 |