提到數據結構與算法都感覺這應該是后端要掌握的知識,對前端來說只要寫寫頁面,綁定事件,向后台發發數據就好了,用不到數據結構與算法,也許對於一些數據查找 簡單的for循環就能搞定,也許只是提高了幾毫米而已,可忽略不計,假入node做后台開發的時候,一次請求節約的幾毫米,千萬次請求節約的就不是毫秒的時間的,數據結構是作為高級程序工程師必會的知識 先來看看js數據類型 基本類型(棧 stack) : Number、String 、Boolean、Null 和 Undefined , Symbol(es6 新增); 基本數據類型是按值訪問 由高向低分配,棧內存最大是 8MB,(超出報棧溢出), String:是特殊的棧內存 (向高分配大小不定),程序員分配 引用類型(堆 heap) :Object 、Array 、Function 、Data;引用類型數據在棧內存中保存的實際上是對象在堆內存中的引用地址(指針),向高分配,系統自動分配 一、堆棧空間分配區別: 棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧; 堆(操作系統): 一般由程序員分配釋放,若程序員不釋放,程序結束時可能由 OS 回收,分配方式倒是類似於鏈表。 二、堆棧緩存方式區別: 棧使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放; 堆是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。 三、堆 、棧數據結構區別: 堆(數據結構):堆可以被看成是一棵樹,如:堆排序; 棧(數據結構):一種先進后出的數據結構。 數據結構 數據結構是指相互之間存在着一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成;數據結構的基本操作的設置的最重要的准則是,實現應用程序與存儲結構的獨立(數據結構=數據的存儲+算法) 數據結構分類 邏輯結構:反映數據之間的邏輯關系; 存儲結構:數據結構在計算機中的表示; 邏輯結構: 集合:結構中的數據元素除了同屬於一種類型外,別無其它關系。(無邏輯關系) 線性結構 :數據元素之間一對一的關系(線性表) 樹形結構 :數據元素之間一對多的關系(非線性) 圖狀結構或網狀結構: 結構中的數據元素之間存在多對多的關系(非線性) 存儲結構: 順序存儲數據結構 鏈式存儲數據結構 索引存儲數據結構 散列存儲數據結構 線性結構 : 隊列: 也是一種運算受限的線性表。它只允許在表的一端進行插入,而在另一端進行刪除。允許刪除的一端稱為隊頭(front),允許插入的一端稱為隊尾(rear)。先進先出。 棧: 是限制在表的一端進行插入和刪除運算的線性表,通常稱插入、刪除的這一端為棧頂(Top),另一端為棧底(Bottom)。先進后出。top= -1時為空棧,top=0只能說明棧中只有一個元素,並且元素進棧時top應該自增. 后進先出 串 :是零個或多個字符組成的有限序列。長度為零的串稱為空串(Empty String),它不包含任何字符。通常將僅由一個或多個空格組成的串稱為空白串(Blank String) 注意:空串和空白串的不同,例如“ ”和“”分別表示長度為1的空白串和長度為0的空串。 非線性結構 樹:一種非線性結構。樹是遞歸結構,在樹的定義中又用到了樹的概念 有序數:子節點之間有順序關系 無序樹:子節點之間沒有順序關系 二叉樹:一種非線性結構。樹是遞歸結構,在樹的定義中又用到了樹的概念 二叉樹遍歷 使得每一個結點均被訪問一次,而且僅被訪問一次。非遞歸的遍歷實現要利用棧。 先序遍歷DLR:根節點->左子樹->右子樹(廣度遍歷) 中序遍歷LDR:左子樹->根節點->右子樹。必須要有中序遍歷才能得到一棵二叉樹的正確順序(廣度遍歷) 后續遍歷LRD:左子樹->右子樹->根節點。需要棧的支持。(廣度遍歷) 層次遍歷:用一維數組存儲二叉樹時,總是以層次遍歷的順序存儲結點。層次遍歷應該借助隊列。(深度遍歷) 內存: 一條很長一維數組; 算法 算法特征: 有窮性、確定性、可行性、輸入、輸出 算法設計衡量: 正確性、可讀性、健壯性, 時間復雜度, 空間復雜度 算法分類 基本算法(必會) 冒泡排序 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)
轉載來着:https://blog.csdn.net/weixin_39755186/article/details/80863717