前端你應該瞭解的數據結構與算法

提到數據結構與算法都感受這應該是後端要掌握的知識,對前端來講只要寫寫頁面,綁定事件,向後臺發發數據就行了,用不到數據結構與算法,也許對於一些數據查找 簡單的for循環就能搞定,也許只是提升了幾毫秒而已,可忽略不計,假入node作後臺開發的時候, 一次請求節約的幾毫秒,千萬次請求節約的就不是毫秒的時間的,數據結構是做爲高級程序工程師必會的知識javascript

歡迎訪問 幸福拾荒者,一個前端知識總結分享平臺,與你們一塊兒共同成長共同進步!🙏🙏🙏前端

先來看看js數據類型

  • 基本類型(棧 stack) : Number、String 、Boolean、Null 和 Undefined , Symbol(es6 新增); 基本數據類型是按值訪問 由高向低分配,棧內存最大是 8MB,(超出報棧溢出), String:是特殊的棧內存 (向高分配大小不定),程序員分配
  • 引用類型(堆 heap) :Object 、Array 、Function 、Data;引用類型數據在棧內存中保存的其實是對象在堆內存中的引用地址(指針),向高分配,系統自動分配
1、堆棧空間分配區別:
  • 棧(操做系統):由操做系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧;
  • 堆(操做系統): 通常由程序員分配釋放,若程序員不釋放,程序結束時可能由 OS 回收,分配方式卻是相似於鏈表。
2、堆棧緩存方式區別:
  • 棧使用的是一級緩存, 他們一般都是被調用時處於存儲空間中,調用完畢當即釋放;
  • 堆是存放在二級緩存中,生命週期由虛擬機的垃圾回收算法來決定(並非一旦成爲孤兒對象就能被回收)。因此調用這些對象的速度要相對來得低一些。
3、堆 、棧數據結構區別:
  • 堆(數據結構):堆能夠被當作是一棵樹,如:堆排序;
  • 棧(數據結構):一種先進後出的數據結構。

數據結構

數據結構是指相互之間存在着一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成;數據結構的基本操做的設置的最重要的準則是,實現應用程序與存儲結構的獨立(數據結構=數據的存儲+算法)java

數據結構分類

  • 邏輯結構:反映數據之間的邏輯關係;node

  • 存儲結構:數據結構在計算機中的表示;git

邏輯結構:
集合:結構中的數據元素除了同屬於一種類型外,別無其它關係。(無邏輯關係)
   線性結構 :數據元素之間一對一的關係(線性表)
   樹形結構 :數據元素之間一對多的關係(非線性)
   圖狀結構或網狀結構: 結構中的數據元素之間存在多對多的關係(非線性)
複製代碼
存儲結構:
順序存儲數據結構
  鏈式存儲數據結構
  索引存儲數據結構
  散列存儲數據結構
複製代碼

線性結構 :

  • 隊列: 也是一種運算受限的線性表。它只容許在表的一端進行插入,而在另外一端進行刪除。容許刪除的一端稱爲隊頭(front),容許插入的一端稱爲隊尾(rear)。先進先出。
  • 棧: 是限制在表的一端進行插入和刪除運算的線性表,一般稱插入、刪除的這一端爲棧頂(Top),另外一端爲棧底(Bottom)。先進後出。top= -1時爲空棧,top=0只能說明棧中只有一個元素,而且元素進棧時top應該自增. 後進先出
  • 串 :是零個或多個字符組成的有限序列。長度爲零的串稱爲空串(Empty String),它不包含任何字符。一般將僅由一個或多個空格組成的串稱爲空白串(Blank String) 注意:空串和空白串的不一樣,例如「 」和「」分別表示長度爲1的空白串和長度爲0的空串。

非線性結構

  • 樹:一種非線性結構。樹是遞歸結構,在樹的定義中又用到了樹的概念
  • 有序數:子節點之間有順序關係
  • 無序樹:子節點之間沒有順序關係
  • 二叉樹:一種非線性結構。樹是遞歸結構,在樹的定義中又用到了樹的概念
二叉樹遍歷

使得每個結點均被訪問一次,並且僅被訪問一次。非遞歸的遍歷實現要利用棧。程序員

  • 先序遍歷DLR:根節點->左子樹->右子樹(廣度遍歷)
    複製代碼
  • 中序遍歷LDR:左子樹->根節點->右子樹。必需要有中序遍歷才能獲得一棵二叉樹的正確順序(廣度遍歷)
    複製代碼
  • 後續遍歷LRD:左子樹->右子樹->根節點。須要棧的支持。(廣度遍歷)
    複製代碼
  • 層次遍歷:用一維數組存儲二叉樹時,老是以層次遍歷的順序存儲結點。層次遍歷應該藉助隊列。(深度遍歷)
    複製代碼

內存: 一條很長一維數組;es6

算法

算法特徵:

有窮性、肯定性、可行性、輸入、輸出github

算法設計衡量:

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

算法分類

基本算法(必會)

冒泡排序

function bubbleSort(arr) {
    var len = arr.length;
    for (var i = 0; i < len - 1; i++) {
        for (var j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j+1]) {        // 相鄰元素兩兩對比
                var temp = arr[j+1];        // 元素交換
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}
複製代碼

快速排序

function swap(items, firstIndex, secondIndex){
    var temp = items[firstIndex];
    items[firstIndex] = items[secondIndex];
    items[secondIndex] = temp;
}

function partition(items, left, right) {
    var pivot = items[Math.floor((right + left) / 2)],
        i = left,
        j = right;
    while (i <= j) {
        while (items[i] < pivot) {
            i++;
        }
        while (items[j] > pivot) {
            j--;
        }
        if (i <= j) {
            swap(items, i, j);
            i++;
            j--;
        }
    }
    return i;
}

function quickSort(items, left, right) {
    var index;
    if (items.length > 1) {
        index = partition(items, left, right);
        if (left < index - 1) {
            quickSort(items, left, index - 1);
        }
        if (index < right) {
            quickSort(items, index, right);
        }
    }
    return items;
}

var items = [3,8,7,2,9,4,10]
var result = quickSort(items, 0, items.length - 1);
複製代碼

插入排序

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;
}
複製代碼

選擇排序

function selectionSort(arr) {
    var len = arr.length;
    var minIndex, temp;
    for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {     // 尋找最小的數
                minIndex = j;                 // 將最小數的索引保存
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}
複製代碼

時間空間複雜度

  • 在冒泡排序,插入排序,選擇排序,快速排序中,在最最壞狀況下,快速排序的時間複雜爲O(n2) ,插入排序O(n2),選擇排序O(n2),冒泡排序O(n2)

歡迎訪問 幸福拾荒者 瞭解更多前端知識!後端

相關文章
相關標籤/搜索