前端需要知道的資料結構與演算法(持續更新中...)

weixin_34253539發表於2019-02-18

基本資料結構

JS 資料型別

基本型別(棧 stack): Number String Boolean Null Undefined 和 Symbol(es6 新增)
引用型別(堆 heap):Object Array Function Data

資料結構

資料結構是指相互之間存在著一種或多種關係的資料元素的集合和該集合中資料元素之間的關係組成

演算法

演算法特徵

有窮性、確定性、可行性、輸入、輸出

演算法設計衡量

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

時間複雜度

執行一段程式的計算工作量,時間複雜度即通常所說的演算法執行所需要耗費的時間,時間越短,演算法越好。但是,一個演算法的執行時間往往無法精確估計。通常需要在實際的計算機執行才知道具體的執行時間。但是,也可以大致進行估計,得到演算法的時間複雜度。演算法的執行時間往往和演算法程式碼中語句執行的數量有關。

空間複雜度

執行一段程式的記憶體佔用,空間複雜度通常指的是演算法程式在計算機只想中只想所需要的儲存空間。

eg:

O(1):常數運算

O(n):1 層迴圈

O(n^2):2 層迴圈

O(n^n):n 層迴圈

O(log2n):int i = 1, n = 100;while(i < n){ i = i * 2;}

演算法分類

  1. 快速排序演算法
  2. 深度優先演算法
  3. 廣度優先演算法
  4. 堆排序演算法
  5. 歸併排序演算法

氣泡排序

原理:每次把最大或者最小的浮到最頂層

let arr = [33, 1, 46, 23, 35, 12, 30, 4, 16, 2]
function bubbleSort(array) {
  for (var i = 0; i < array.length; i++) {
    for (var j = 0; j < array.length - i - 1; j++) {
      if (array[j] > array[j + 1]) {
        var temp = array[j]
        array[j] = array[j + 1]
        array[j + 1] = temp
      }
    }
  }
  return array
}

插入排序

原理:從陣列的第二個和第一個比較,如果小於第一個則插入到第一個元素之前,否則不變
第三個一次和第二個第一個比,如果小於第二個且大於第一個則插入第二個元素之前

let arr = [33, 1, 46, 23, 35, 12, 30, 4, 16, 2]
function insertionSort(arr) {
  var len = arr.length
  var preIndex, current
  for (var i = 1; i < len; i++) {
    preIndex = i - 1
    current = arr[i]
    while (preIndex >= 0 && arr[preIndex] > current) {
      arr[preIndex + 1] = arr[preIndex]
      preIndex--
    }
    arr[preIndex + 1] = current
  }
  return arr
}

選擇排序

原理:從陣列的第一個開始,向後比較,找到最小的和第一個交換

let arr = [33, 1, 46, 23, 35, 12, 30, 4, 16, 2]
function selectionSort(arr) {
  var len = arr.length
  var minIndex, temp
  for (var i = 0; i < len; i++) {
    minIndex = i
    for (var j = i + 1; j < len; j++) {
      if (arr[minIndex] > arr[j]) {
        minIndex = j
      }
    }
    temp = arr[i]
    arr[i] = arr[minIndex]
    arr[minIndex] = temp
  }
  return arr
}

演算法複雜度

排序方法 時間複雜度(最壞) 時間複雜度(最好) 空間複雜度 穩定性 複雜性
氣泡排序 O(n^2) O(n) O(1) 穩定 簡單
插入排序 O(n^2) O(n) O(1) 穩定 簡單
選擇排序 O(n^2) O(n^2) O(1) 不穩定 簡單

參考

  1. 前端你應該瞭解的資料結構與演算法
  2. 如何理解時間複雜度和空間複雜度 3. 時間複雜度和空間複雜度

相關文章