1. 數(shù)據(jù)結(jié)構(gòu)和算法之開篇

1. 前言

對于一名有追求的程序猿來說,數(shù)據(jù)結(jié)構(gòu)和算法是一門必修課,它是內(nèi)功,內(nèi)功的深厚直接決定了解決問題的能力和學(xué)習(xí)新技術(shù)的能力。

2. 定義

廣義上:
數(shù)據(jù)結(jié)構(gòu)就是數(shù)據(jù)的存放方式,就像圖書館中的書排列的規(guī)則。
算法就是操作數(shù)據(jù)的方式,就像如何從圖書館中找一本書的方法。

狹義上:
數(shù)組、鏈表、隊(duì)列、棧、樹、圖就是數(shù)據(jù)結(jié)構(gòu)
冒泡排序、堆排序、二分查找、Dijkstra就是算法

它們相輔相成,總結(jié)來說:

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

3.意義

  1. 寫出高質(zhì)量的代碼, 程序在性能上有質(zhì)的提升。
  2. 提升邏輯思維能力,更容易看懂別人寫的代碼。
  3. 助攻面試,進(jìn)大廠。
  4. 為轉(zhuǎn)戰(zhàn)AI,打下基礎(chǔ)。

4. 數(shù)據(jù)結(jié)構(gòu)

4.1 數(shù)據(jù)結(jié)構(gòu)的分類

數(shù)據(jù)結(jié)構(gòu)可分為:

  1. 邏輯結(jié)構(gòu):指數(shù)據(jù)對象中數(shù)據(jù)元素之間的相互關(guān)系,也是我們研究的重點(diǎn)
  2. 物理結(jié)構(gòu):數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)中的存儲形式

4.2 邏輯結(jié)構(gòu)

四大邏輯結(jié)構(gòu)

  1. 集合結(jié)構(gòu):集合結(jié)構(gòu)中的元素除了同屬于一個(gè)集合外,它們之間沒有其他關(guān)系


    集合.png
  2. 線性結(jié)構(gòu): 線性結(jié)構(gòu)中的數(shù)據(jù)之間是一對一的關(guān)系


    線性.png
  3. 樹形結(jié)構(gòu):樹形結(jié)構(gòu)中的數(shù)據(jù)元素之間是一對多的層次關(guān)系


    樹形.png
  4. 圖形結(jié)構(gòu): 圖形結(jié)構(gòu)的數(shù)據(jù)元素是多對多的關(guān)系


    圖形.png

四種邏輯結(jié)構(gòu)的對比如下:

序號 名稱 元素之間的關(guān)系
1 集合結(jié)構(gòu) 沒有關(guān)系
2 線性結(jié)構(gòu) 一對一
3 樹形結(jié)構(gòu) 一對多
4 圖形結(jié)構(gòu) 多對多

4.3 物理結(jié)構(gòu)

物理結(jié)構(gòu)其實(shí)就是研究如何將數(shù)據(jù)元素存儲到計(jì)算機(jī)的存儲器中,這里指的存儲器是針對內(nèi)存而言,像硬盤、軟盤、光盤等外部存儲設(shè)備通常是以文件的形式來描述的。

數(shù)據(jù)元素的存儲結(jié)構(gòu)形式有兩種:順序存儲和鏈?zhǔn)酱鎯?/p>

  1. 順序存儲結(jié)構(gòu):是把元素存放在地址連續(xù)的存儲單元里,其數(shù)據(jù)間的邏輯關(guān)系和物理關(guān)系是一致的。例如數(shù)組


    順序存儲.png
  2. 鏈?zhǔn)酱鎯Y(jié)構(gòu): 把數(shù)據(jù)元素存放在任意的存儲單元里,這組存儲單元可以是連續(xù)的,也可以是不連續(xù)的。

這個(gè)時(shí)候其存儲單元的位置不能表達(dá)其邏輯關(guān)系,所以就需要指針來表示元素之間的邏輯關(guān)系
鏈?zhǔn)酱鎯?png

兩種物理結(jié)構(gòu)的對比如下所示:

序號 名稱 元素存儲特點(diǎn)
1 順序存儲結(jié)構(gòu) 地址連續(xù)的存儲單元里
2 鏈?zhǔn)酱鎯Y(jié)構(gòu) 地址不一定連續(xù)的存儲單元里

5. 算法

算法就是特定問題解決方法的步驟描述,在計(jì)算機(jī)中用指令來表達(dá)

5.1 舉例

最經(jīng)典的一個(gè)例子:1 + 2 + 3 ... + 100

如果我們按照順序加下去,需要運(yùn)算的次數(shù)就是99次加法運(yùn)算,代碼表達(dá):

        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }

但是,我們可以發(fā)現(xiàn)1 + 100 = 101, 2 + 99 = 101 ...... 50 + 55 = 101

所以和為 50 * 101 = 5050,找到規(guī)律以后,只要做1次乘法運(yùn)算,代碼表達(dá):

        int sum = 50 * 101;

這就是兩個(gè)不同的算法,可以看出,算法2效率明顯高于算法1

5.2 特性

  1. 輸入:零個(gè)或多個(gè)輸入
  2. 輸出:至少一個(gè)或多個(gè)輸出
  3. 有窮性:指算法在執(zhí)行有限的步驟后,自動結(jié)束而不會出現(xiàn)無限循環(huán),并且每一個(gè)步驟在可接受的范圍之內(nèi)
  4. 確定性:算法的每一個(gè)步驟都具有確定的含義,不會出現(xiàn)二義性
  5. 可行性:算法的每一步都必須是可行的,也就是說,每一步都能夠執(zhí)行有限次數(shù)完成。

5.3 要求

設(shè)計(jì)算法主要追求如下兩個(gè)方面

  1. 時(shí)間效率高(時(shí)間復(fù)雜度)
  2. 存儲量低(空間復(fù)雜度)

6. 總結(jié)

  1. 數(shù)據(jù)結(jié)構(gòu)和算法很重要,是內(nèi)功。
  2. 程序設(shè)計(jì) = 數(shù)據(jù)結(jié)構(gòu) + 算法
  3. 數(shù)據(jù)結(jié)構(gòu)包括:邏輯結(jié)構(gòu)和物理結(jié)構(gòu)
  4. 邏輯結(jié)構(gòu)包括:集合結(jié)構(gòu)、線性結(jié)構(gòu)、樹形結(jié)構(gòu)、圖形結(jié)構(gòu)
  5. 物理結(jié)構(gòu)包括: 順序存儲結(jié)構(gòu)和鏈?zhǔn)酱鎯Y(jié)構(gòu)
  6. 算法就是特定問題解決方法的步驟描述
  7. 算法的考量主要使用時(shí)間復(fù)雜度和空間復(fù)雜度

參考資料:小甲魚的數(shù)據(jù)結(jié)構(gòu)..

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,032評論 2 89
  • 1)這本書為什么值得看: Python語言描述,如果學(xué)的Python用這本書學(xué)數(shù)據(jù)結(jié)構(gòu)更合適 2016年出版,內(nèi)容...
    孫懷闊閱讀 12,604評論 0 15
  • 第二十五章 永遠(yuǎn)的藍(lán)心兒 文?十月五 心藍(lán)看著狹長的院子,兩邊擺滿了一盆一盆的綠植,有心藍(lán)最喜歡的吊蘭,翠綠翠綠...
    十月五閱讀 383評論 7 16
  • 女人啊!感覺這一輩子真的沒什么意思,很多人都在為家庭付出、為了孩子付出,自己舍不得為自己著想,在婆家是個(gè)外人,孩子...
    阿婷ting閱讀 154評論 0 1
  • 對于從小就喜歡酸酸甜甜口感的小朋友來說,沒有什么比番茄醬更能激起食欲了。市場上買回來的番茄醬總有一股食品添加劑的味...
    vickyluo閱讀 401評論 0 2