前端基礎整理-數據結構和算法

概述

  • 數據結構

定義:數據存儲和組織的方式.
常規操做:檢索/插入/刪除/排序/更新
分類:線性、非線性html

  • 線性:數組、棧、隊列、鏈表
  • 非線性:樹(二叉樹、b樹、平衡樹、字典樹、紅黑樹)、散列表、堆、圖
  • 算法

定義:解決一系列問題的清晰指令。(解決方案)
優劣判斷:時間複雜度、空間複雜度
常見的有:排序(冒泡、快速)
動態規劃(一套解決問題的方法論),核心概念以下:git

  • 狀態
  • 狀態轉移方程
  • 邊界條件
  • 學習資料
https://github.com/hustcc/JS-...
https://www.cs.usfca.edu/~gal...
https://visualgo.net/zh/bst
https://www.cxyxiaowu.com/
https://item.jd.com/139919397...
https://leetcode.com

數據結構

  • 數據結構是計算機存儲、組織數據的方式。
  • 相互之間存在一種或多種特定關係的數據元素的集合。
  • 合適的數據結構能夠在特定的環境下帶來更高的運行或存儲效率。
  • 分類:線性、非線性
  • 基本操做:檢索、更新、插入、刪除、排序。

線性

數組、棧、隊列、鏈表

數組

在內存中連續存儲多個元素的結構,在內存中的分配也是連續的
數組中的元素經過數組下標進行訪問,數組下標從0開始
  • 優勢github

    • 按照順序遍歷、查詢元素速度快
  • 缺點算法

    • 數組的大小固定後就沒法擴容了
    • 數組只能存儲同一種類型的數據
    • 添加,刪除的操做慢,由於要移動其餘的元素
不少語言裏的「數組」實際上不是真正的數組

隊列是一種限制性線性結構
僅能在線性表的一端操做,先進棧的元素要後取出
從棧頂放入元素的操做叫入棧,取出元素叫出棧(IFLO)

場景有:路由棧、調用棧數組

隊列

隊列也是一種限制性線性結構
只能在一端添加元素,在另外一端取出元素,也就是先進先出
從一端放入元素的操做稱爲入隊,取出元素爲出隊(IFFO)
適用在多線程阻塞隊列管理

如:瀏覽器事件循環系統中的消息隊列,以及宏任務中的微任務隊列等瀏覽器

鏈表

鏈表是物理存儲單元上非連續的、非順序的存儲結構
數據元素的邏輯順序是經過鏈表的指針地址實現
每一個結點包含兩個元素:存儲元素的數據域、指向下一個結點地址的指針域
根據指針的指向,鏈表能造成不一樣的結構,例如單鏈表,雙向鏈表,循環鏈表

image.png

  • 優勢緩存

    • 鏈表是很經常使用的一種數據結構,不須要初始化容量,能夠任意加減元素
    • 添加、刪除很快,只須要改變先後兩個元素結點的指針域指向地址便可
  • 缺點數據結構

    • 含有大量的指針域,須要佔用額外空間
    • 查找元素須要遍歷鏈表來查找,很是耗時
  • 適應場景多線程

    • 須要頻繁增長,刪除操做的場景

非線性

樹、散列表、堆、圖

樹是一種數據結構,它是由n個有限節點組成一個具備層次關係的集合
  • 樹的特色:dom

    • 每一個節點有零個或多個子節點
    • 沒有父節點的節點稱爲根節點
    • 每個非根節點有且只有一個父節點
    • 除了根節點外,每一個子節點能夠分爲多個不相交的子樹

image.png

二叉樹
  • 二叉樹是樹的特殊一種,具備以下特色:

    • 每一個結點最多有兩顆子樹,結點的度最大爲2
    • 左子樹和右子樹是有順序的,次序不能顛倒
    • 即便某結點只有一個子樹,也要區分左右子樹
  • 二叉樹是一種有用的折中方案,既有鏈表的好處,也有數組的好處
  • 添加,刪除元素都很快,而且在查找方面也有不少的算法優化

image.png

B樹、B+樹
平衡的多叉樹
根節點至少有兩個子節點
每一個節點有M-1個key,而且以升序排列
位於M-1和M key的子節點的值位於M-1 和M key對應的Value之間
其它節點至少有M/2個子節點
全部的葉子結點都位於同一層
image.png
紅黑樹
一種自平衡二叉查找樹
節點是紅色或黑色
根節點是黑色
每一個紅色節點的兩個子節點都是黑色
從任一節點到其每一個葉子的全部路徑都包含相同數目的黑色節點
三種操做:左旋、右旋和變色
image.png
字典樹
用於統計,排序和保存大量的字符串,常常被搜索引擎系統用於文本詞頻統計
利用字符串的公共前綴來減小查詢時間,最大限度地減小無謂的字符串比較,查詢效率比哈希樹高
image.png

散列表

根據關鍵碼和值 (key和value) 直接進行訪問的數據結構
若數據的關鍵字爲k,則其值存放在f(k)的存儲位置上
f(k)稱爲散列函數,按這個思想創建的表爲散列表
哈希函數的構造方法
哈希衝突的解決方案
image.png
用散列表保存100萬個電話號碼

利用徹底二叉樹的結構來維護一組數據
堆雖然是一顆樹,可是一般存放在一個數組中
堆中某個節點的值老是不大於或不小於其父節點的值
大根堆、小根堆、堆排序
image.png

頂點、邊、權重
有向圖,無向圖
鄰接矩陣、鄰接表、十字鏈表
深度優先遍歷、廣度優先遍歷
image.png

算法

算法是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法表明着用系統的方法描述解決問題的策略機制。
可以對必定規範的輸入,在有限時間內得到所要求的輸出。

算法特徵

  • 算法有窮性(Finiteness):指算法必須能在執行有限個步驟以後終止
  • 算法確切性(Definiteness):算法的每一步驟必須有確切的定義;
  • 算法輸入項(Input):一個算法有0個或多個輸入,以刻畫運算對象的初始狀況,所謂0個輸入是指算法自己定出了初始條件;
  • 算法輸出項(Output):一個算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的算法是毫無心義的
  • 算法可行性(Effectiveness):算法中執行的任何計算步驟都是能夠被分解爲基本的可執行的操做步,即每一個計算步均可以在有限時間內完成(也稱之爲有效性)。

算法優劣判斷

  • 正確性
  • 可讀性
  • 健壯性
  • 時間複雜度
  • 空間複雜度

常見覆雜度表達式

常數階 O(1)
對數階 O(log2n)
線性階 O(n)
線性對數階 O(nlog2n)
平方階 O(n2)
立方階 O(n3)
次方階 O(nk)
指數階 O(2n)
階乘O(n!)

排序算法

image.png

查找算法

image.png

動態規劃

  • 動態規劃不是一種固定形式的算法,動態規劃是一種解決問題的思想
  • 一個規模比較大的問題,能夠經過規模比較小的若干問題的結果來獲得
  • 只要子問題被計算過,就將其結果保存起來供之後使用,這就是動態規劃法的基本思路

動態規劃核心概念

動態規劃簡單示例

image.png

如圖1+2+3+4=10能夠做爲已知條件用在解決下面相似的問題上.

動態規劃示例: 臺階問題

image.png

加密算法

  • 對稱加密

    • DES算法
    • 3DES算法
    • AES算法
  • 非對稱加密

    • RSA算法
    • ECC算法
    • 散列算法
    • MD5算法
    • SHA1算法

緩存淘汰算法

First in first out (FIFO)
Last in first out (LIFO)
Least recently used (LRU)
Least Recently Used(LRU)
Random replacement (RR)

最優解算法

窮舉法
遺傳算法
登山算法
模擬退火
貪心算法

其它算法

分類算法
調度算法
全排列算法
壓縮算法

總結

程序 = 算法 + 數據結構
相關文章
相關標籤/搜索