邂逅數(shù)據(jù)結(jié)構(gòu)和算法

??可能你之前經(jīng)常在很多地方看到有人討論數(shù)據(jù)結(jié)構(gòu)與算法,但對于他到底是一個什么樣的東西,一直是云里霧里的,特別是對于那些從其他行業(yè)轉(zhuǎn)到編程領(lǐng)域的人來說,數(shù)據(jù)結(jié)構(gòu)和算法他的概念就會更加模糊了,

??那么數(shù)據(jù)結(jié)構(gòu)和算法到底指定是什么東西呢,我們到底有沒有必要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法呢?因為似乎我們學(xué)習(xí)編程過程中,似乎沒有必要了解這些,我們只是在學(xué)習(xí)一門語言的 基本語法/高級語法。然后通過他的一些語法去做出來一些界面效果,特別是對于前端來說,我們只需要學(xué)習(xí)它的語法然后去結(jié)合一些框架和庫就可以達到這個目的,當然它其中可能包括一些復(fù)雜的邏輯結(jié)構(gòu),我們只需要把我們是思維轉(zhuǎn)化為代碼,來實現(xiàn)復(fù)雜的邏輯結(jié)構(gòu)就可以了,那數(shù)據(jù)結(jié)構(gòu)和算法是什么? I don't care,我不關(guān)心,我只需要完成上面給我的任務(wù),而且我完成的非常好,那不就可以了嗎?數(shù)據(jù)結(jié)構(gòu)和算法什么的我并不需要,確實如果我們只是想了解語言的應(yīng)用層面,那么數(shù)據(jù)結(jié)構(gòu)和算法顯得沒那么重要但是如果我們希望了解語言的設(shè)計層面,那么數(shù)據(jù)結(jié)構(gòu)和算法就很重要了

1,什么是數(shù)據(jù)結(jié)構(gòu)

??數(shù)據(jù)結(jié)構(gòu)其實沒有官方的定義,那我們就看幾種比較權(quán)威的民間定義

數(shù)據(jù)結(jié)構(gòu)式數(shù)據(jù)對象,以及存在于該對象的實例和組成實例的數(shù)據(jù)元素之間的各種聯(lián)系。這些聯(lián)系可以通過定義相關(guān)的函數(shù)來給出
---《數(shù)據(jù)結(jié)構(gòu),算法與應(yīng)用》

數(shù)據(jù)結(jié)構(gòu)是ADT(抽象數(shù)據(jù)類型 Abstract Data Type)的物理實現(xiàn)
---《數(shù)據(jù)結(jié)構(gòu)與算法分析》

數(shù)據(jù)結(jié)構(gòu)(data structure)是計算機儲存,組織數(shù)據(jù)的方式。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來最優(yōu)效率的算法。
---維基百科

??我們這里需要注意一點,所有關(guān)于數(shù)據(jù)結(jié)構(gòu)的定義都會和一個詞聯(lián)系起來算法,這是因為所有數(shù)據(jù)結(jié)構(gòu)的定義和實現(xiàn)都離不開算法,后面的文章我們還會詳細介紹算法,它和數(shù)據(jù)結(jié)構(gòu)同樣重要

??下面我們從自己的角度來認識數(shù)據(jù)結(jié)構(gòu)吧,其實數(shù)據(jù)結(jié)構(gòu)就是在計算機中儲存和組織數(shù)據(jù)的方式,我們知道,計算機中數(shù)據(jù)量非常龐大,那如何以高效的方式組織和存儲呢?

??這就好比一個龐大的圖書館中存放了大量的書籍,我們不僅僅要把書放進入,還應(yīng)該在需要的時候能夠輕松的取出來,所以我們就應(yīng)該以合理的方式來組織這些圖書(數(shù)據(jù))才能達到一個比較好的效果,下面我們就以圖書館這個例子展開說明

我們應(yīng)該怎樣擺放圖書呢,這個應(yīng)該是跟數(shù)據(jù)量有關(guān)的

  • 比如說我們的書籍相對較少


    書架
  • 那假如你有一家書店,書籍數(shù)量相對較多,


    書屋
  • 假如你有一家圖書館,書籍量相當龐大


    國家圖書館

最終圖書擺放要使得兩個相關(guān)操作方便實現(xiàn)

  1. 新書怎么插入?
  2. 怎么找到某本指定的圖書?

以下列舉出幾種方式
方法1:隨便放

  • 插入:哪里有空放哪里,一步到位!
  • 查找:找某本書,累死.....

方法2:按照書名和拼音字母順序排放

  • 插入:新進一本《阿Q正傳》,按照字母排序放到相應(yīng)位置
  • 查找:首先找到首字母區(qū)域,然后這個較小的區(qū)域中查找(二分查找法)

方法3:將書架劃分為幾塊區(qū)域按照類別存放,類別中按照字母排序

  • 插入:先定類別然后按照字母排序放到相應(yīng)位置
  • 查找:先定類別,再二分查找

結(jié)論:當你準備去解決一個問題,解決問題的效率是和數(shù)據(jù)的組織方式有關(guān),數(shù)據(jù)結(jié)構(gòu)直接影響到你解決問題的效率,一個好的數(shù)據(jù)組織方式是你解決問題的關(guān)鍵

下面我們先看下編程中常見的集中數(shù)據(jù)結(jié)構(gòu)


常見的數(shù)據(jù)結(jié)構(gòu)

??常見的數(shù)據(jù)結(jié)構(gòu)較多,每一種都有其對應(yīng)的應(yīng)用場景,不同的數(shù)據(jù)結(jié)構(gòu)的不同操作性能是不同的,有的查詢性能很快,有的插入速度很快,有的是插入頭和尾速度很快,有的做范圍查找很快,有的允許元素重復(fù),有的不允許重復(fù)等等,在開發(fā)中要根據(jù)具體的需求來選擇

PS:數(shù)據(jù)結(jié)構(gòu)和算法是和編程語言無關(guān)的,而常見的編程語言都有直接或間接的使用我們上述所說的數(shù)據(jù)結(jié)構(gòu),比如javascript中的Array,Set,Map,Object等等。之前我們一直是以API使用者的身份去使用他們,如果我們更加想要了解它們的底層,數(shù)據(jù)結(jié)構(gòu)和算法的學(xué)習(xí)是不可或缺的,個人非常喜歡的一句話,了解真相你才能獲得真正你的自由,了解底層實現(xiàn)后,你在用這些東西的時候你才能更加自由,更加的得心應(yīng)手和靈活,死記規(guī)則你只能漂于表面

2,什么是算法

??算法(Algorithm),在之前的學(xué)習(xí)中,我們可能已經(jīng)學(xué)習(xí)過幾種排序算法,并且知道不同的算法執(zhí)行效率是不一樣的,也就是說解決問題的過程中,不僅僅數(shù)據(jù)的存儲方式會影響效率,算法的優(yōu)劣也會影響著效率,那么到底什么是算法呢?

?? 數(shù)據(jù)結(jié)構(gòu)是組織和存儲數(shù)據(jù)的一種方式,而算法就是解決問題的辦法,解決問題的步驟,解決問題的邏輯,解決問題我們采用的一步一步的操作

算法的定義:

  1. 一個有限指令集,每條指令的描述不依賴于語言
  2. 接受一些輸入(有些情況下不需要輸入,視情況而定)
  3. 產(chǎn)生輸出
  4. 一定在有限步驟之后終止(不應(yīng)該是一個死循環(huán))

算法通俗理解:Algorithm這個單詞本意就是解決問題的辦法/步驟邏輯,數(shù)據(jù)結(jié)構(gòu)的實現(xiàn),離不開算法

舉例
電燈不工作的解決算法

步驟

這就是解決電燈不工作的算法(步驟)

結(jié)論:我們?nèi)绻胍鉀Q某個問題一定是按照某個步驟,一步一步去完成的,而這些步驟綜合起來就是我們解決這個問題它算法

·

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容