提到數據結構與算法都感受這應該是後端要掌握的知識,對前端來講只要寫寫頁面,綁定事件,向後臺發發數據就行了,用不到數據結構與算法,也許對於一些數據查找 簡單的for循環就能搞定,也許只是提升了幾毫秒而已,可忽略不計,假入node作後臺開發的時候, 一次請求節約的幾毫秒,千萬次請求節約的就不是毫秒的時間的,數據結構是做爲高級程序工程師必會的知識javascript
歡迎訪問 幸福拾荒者,一個前端知識總結分享平臺,與你們一塊兒共同成長共同進步!🙏🙏🙏前端
- 棧(操做系統):由操做系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧;
- 堆(操做系統): 通常由程序員分配釋放,若程序員不釋放,程序結束時可能由 OS 回收,分配方式卻是相似於鏈表。
- 棧使用的是一級緩存, 他們一般都是被調用時處於存儲空間中,調用完畢當即釋放;
- 堆是存放在二級緩存中,生命週期由虛擬機的垃圾回收算法來決定(並非一旦成爲孤兒對象就能被回收)。因此調用這些對象的速度要相對來得低一些。
- 堆(數據結構):堆能夠被當作是一棵樹,如:堆排序;
- 棧(數據結構):一種先進後出的數據結構。
數據結構是指相互之間存在着一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成;數據結構的基本操做的設置的最重要的準則是,實現應用程序與存儲結構的獨立(數據結構=數據的存儲+算法)java
邏輯結構:反映數據之間的邏輯關係;node
存儲結構:數據結構在計算機中的表示;git
集合:結構中的數據元素除了同屬於一種類型外,別無其它關係。(無邏輯關係)
線性結構 :數據元素之間一對一的關係(線性表)
樹形結構 :數據元素之間一對多的關係(非線性)
圖狀結構或網狀結構: 結構中的數據元素之間存在多對多的關係(非線性)
複製代碼
順序存儲數據結構
鏈式存儲數據結構
索引存儲數據結構
散列存儲數據結構
複製代碼
- 有序數:子節點之間有順序關係
- 無序樹:子節點之間沒有順序關係
- 二叉樹:一種非線性結構。樹是遞歸結構,在樹的定義中又用到了樹的概念
使得每個結點均被訪問一次,並且僅被訪問一次。非遞歸的遍歷實現要利用棧。程序員
先序遍歷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)
歡迎訪問 幸福拾荒者 瞭解更多前端知識!後端