管理和利用大型數據集
從資料庫中搜索特定數據
針對特定程序量身定製的設計算法
一次處理來自用戶的多個請求
簡化並加速數據處理
數據結構對於有效,現實地解決問題至關重要。畢竟,我們組織數據的方式對性能和可用性有很大影響。實際上,大多數頂級公司都需要對數據結構有深刻的了解。這些技能證明你知道如何有效地管理數據。任何想要破解編碼面試的人都需要掌握數據結構。JavaScript具有原始和非原始數據結構。原始數據結構和數據類型是程式語言固有的。這些包括布爾值,空值,數字,字符串等。非原始數據結構不是由程式語言定義的,而是由程式設計師定義的。這些包括線性數據結構,靜態數據結構和動態數據結構,例如隊列和連結列表。現在你已經了解了為什麼數據結構那麼重要了,接下來我們就來討論一下每個JavaScript開發人員都需要知道的7種數據結構。數組是所有數據結構中最基本的,它主要將數據存儲在內存中供以後使用。每個數組都有固定數量的單元格(取決於其創建),並且每個單元格都有用於選擇其數據的相應數字索引。每當你想要使用數組時,你就可以訪問其中的任何數據。有關更深入的說明,請參閱有關數組的Edpresso文章!(地址:https://www.educative.io/edpresso/what-are-arrays-in-javascript)隊列在概念上類似於堆棧。兩者都是順序結構,但按輸入順序而不是最新元素對處理元素進行排隊。結果,可以將隊列視為堆棧的FIFO(先進先出)版本。這些作為請求的緩衝區很有用,按照接收到的順序存儲每個請求,直到可以處理為止。為了獲得視覺效果,請考慮單車道隧道:第一個進入隧道的汽車,一定是第一個離開的汽車。如果其他汽車希望退出但先停車,則所有汽車都必須等待先退出才能繼續。在接收頻繁數據時作為緩衝區有效
存儲訂單敏感數據(如存儲的語音郵件)的便捷方法
確保最早的數據先被處理
連結列表是一種數據結構,與前三個列表不同,它不使用數據在內存中的物理放置。這意味著連結列表而不是索引或位置,而是使用引用系統:元素存儲在包含指向下一個節點的指針的節點中,重複直到所有節點都連結為止。該系統無需重新組織即可有效地插入和取出物品。比數組使用更多的內存
檢索特定元素效率低下
向後遍歷列表效率低下
最適合在必須快速連續從未知位置添加和刪除數據的情況下使用有關更深入的說明,請參閱連結列表上的Edpresso文章!(地址:https://www.educative.io/edpresso/what-is-a-linked-list)樹是另一種基於關係的數據結構,專門用於表示層次結構。像鍊表一樣,節點包含數據元素和指示其與直接節點關係的指針。每棵樹都有一個「根」節點,所有其他節點都從該「根」節點分支。根包含對直接在其下的所有元素的引用,這些元素稱為「子節點」。隨著每個子節點繼續分支到更多的子節點。具有連結的子節點的節點稱為內部節點,而沒有子節點的節點稱為外部節點。常見的樹類型是「二進位搜索樹」,用於輕鬆搜索存儲的數據。這些搜索操作非常高效,因為其搜索持續時間不取決於節點數,而是取決於樹下的層數。存儲分層數據,例如文件位置。
二進位搜索樹非常適合需要搜索或排序數據的任務。
有關更深入的解釋,請參閱有關樹木的Edpresso文章!(地址:https://www.educative.io/edpresso/what-is-a-tree)圖表是基於關係的數據結構,有助於存儲類似Web的關係。在圖中稱為每個節點或頂點,都有一個標題(A,B,C等),包含的值以及與其他頂點的連結(稱為邊)列表。可以通過文字快速傳達視覺效果
可用於建模多種主題,只要它們包含關係結構
在更高的級別上,將文本轉換為圖像可能會很耗時。
可能很難看到現有的邊或給定頂點已連接多少條邊
有關更深入的說明,請參閱有關圖表的Edpresso文章!(地址:https://www.educative.io/edpresso/what-is-a-graph-data-structure)哈希表是一個複雜的數據結構,能夠存儲大量信息並有效地檢索特定元素。該數據結構依賴於鍵/值對的概念,其中「鍵」是搜索到的字符串,「值」是與該鍵配對的數據。使用預定義的哈希函數,將每個搜索到的鍵從其字符串形式轉換為稱為哈希的數值。然後,此哈希指向存儲桶-表中較小的子組。然後,它將在存儲桶中搜索最初輸入的鍵,並返回與該鍵關聯的值。鍵可以採用任何形式,而數組的索引必須為整數
高效的搜索功能
每次搜索的操作次數不變
插入或刪除操作的固定成本
從鍵和值的類型到其哈希函數的工作方式,每個哈希表都可以有很大不同。由於這些差異以及哈希表的多層方面,幾乎不可能如此概括。有關更深入的說明,請參閱有關哈希表的Edpresso文章!(地址:https://www.educative.io/edpresso/what-is-a-hash-table)學習JavaScript數據結構,而無需遍歷視頻或文檔。Educative的基於文本的課程易於瀏覽,並具有實時編碼環境-使學習快速高效。JavaScript中的數據結構:面試複習(地址:https://www.educative.io/courses/data-structures-in-javascript-an-interview-refresher)對於許多開發人員和程式設計師而言,數據結構對於破解編程面試至關重要。有關數據結構的問題是現代編程開發面試中的基礎。實際上,對於你的應聘能力和入門級職位,有很多話要說。今天,我們將討論JavaScript數據結構的七個常見編碼面試問題,針對我們上面討論的每個數據結構。每個人還將基於BigO符號理論討論其時間複雜度。問題陳述:實現一個函數removeEven(arr),該函數在其輸入中使用數組arr並從給定數組中刪除所有偶數元素。你可以通過兩種方式解決面試中的問題。讓我們討論一下。"use strict";const Stack = require('./Stack.js');
function isBalanced(exp) {var myStack = new Stack();//Iterate through the string expfor (var i = 0; i < exp.length; i++) {//For every closing parenthesis check for its opening parenthesis in stack
if (exp[i] == '}' || exp[i] == ')' || exp[i] == ']') {
if (myStack.isEmpty()) {
return false }let output = myStack.pop();//If you can't find the opening parentheses for any closing one then returns false.if (((exp[i] == "}") && (output != "{")) || ((exp[i] == ")") && (output != "(")) || ((exp[i] == "]") && (output != "["))) {return false; }
} else {//For each opening parentheses, push it into stack myStack.push(exp[i]); }
}//after complete traversal of string exp, if there's any opening parentheses left//in stack then also return false.if (myStack.isEmpty() == false) {return false }//At the end return true if you haven't encountered any of the above false conditions.return true}
var inputString = "{[()]}"console.log(inputString)console.log(isBalanced(inputString))
inputString = "{[([({))]}}"console.log(inputString)console.log(isBalanced(inputString))要查看此解決方案的其餘代碼,請轉到Educative.io在嵌入式環境中運行代碼。此過程將一次遍歷字符串一個字符。我們可以根據兩個因素確定字符串不平衡:如果括號是開括號,則將其推入堆棧。如果最終所有平衡,則堆棧將為空。如果不為空,則返回False。由於我們僅遍歷字符串exp一次,因此時間複雜度為O(n)。問題陳述:實現一個函數findBin(n),該函數將使用隊列以字符串形式生成從1到n的二進位數。解決此問題的最簡單方法是使用隊列從以前的號碼生成新號碼。讓我們分解一下。"use strict";const Queue = require('./Queue.js');function findBin(n) {let result = [];let myQueue = new Queue();var s1, s2; myQueue.enqueue("1");for (var i = 0; i < n; i++) {
result.push(myQueue.dequeue()); s1 = result[i] + "0"; s2 = result[i] + "1";
myQueue.enqueue(s1); myQueue.enqueue(s2);
}
return result;}
console.log(findBin(10))['1','10','11','100','101','110','111','1000','1001','1010']要查看此解決方案的其餘代碼,請轉到Educative.io在嵌入式環境中運行代碼。
關鍵是通過將0和1附加到先前的二進位數來生成連續的二進位數。澄清,一旦我們生成了一個二進位數,它將被排隊到隊列中,這樣,當我們將0和1附加到隊列中時,如果我們附加了0和1,就可以生成新的二進位數。由於隊列遵循「先進先出」屬性,因此將排隊的二進位數出隊,以使所得數組在數學上正確。看上面的代碼。在第7行,將1排隊。為了生成二進位數字序列,將數字出隊並存儲在數組結果中。在第11-12行,我們將0和1附加起來以產生下一個數字。這些新數字也排在第14-15行。隊列將採用整數值,因此它將在排隊時將字符串轉換為整數。該解決方案的時間複雜度為O(n)O(n),因為恆定時間操作執行了n次。問題陳述:編寫反向函數以獲取一個單鏈列表並將其反向定位。LinkedList = 0->1->2->3-4LinkedList = 4->3->2->1->0解決此問題的最簡單方法是使用迭代指針操作。讓我們來看看。"use strict";const LinkedList = require('./LinkedList.js');const Node = require('./Node.js');
function reverse(list) { let previousNode = null; let currentNode = list.getHead(); // The current node let nextNode = null; // The next node in the list
//Reversal while (currentNode != null) { nextNode = currentNode.nextElement; currentNode.nextElement = previousNode; previousNode = currentNode; currentNode = nextNode; }
//Set the last element as the new head node list.setHead(previousNode);
}
let list = new LinkedList();list.insertAtHead(4);list.insertAtHead(9);list.insertAtHead(6);list.insertAtHead(1);list.insertAtHead(0);list.printList();reverse(list);list.printList();要查看此解決方案的其餘代碼,請轉到Educative.io在嵌入式環境中運行代碼。
我們使用循環遍歷輸入列表。對於當前節點,其與先前節點的連結被反向。然後,next將下一個節點存儲在列表中。讓我們按行細分。第22行-將當前節點的nextElement存儲在next中第23行-將當前節點的nextElement設置為Previous第24行-將當前節點設為新的上一個節點,以進行下一次迭代問題陳述:使用findMin(root)函數在二進位搜索樹中查找最小值。bst = {6 -> 4,94 -> 2,59 -> 8,1212 -> 10,14}where parent -> leftChild,rightChild該解決方案首先檢查根是否為空。如果是,則返回null。然後,它移動到左側子樹,並繼續每個節點的左側子級,直到到達最左側的子級。"use strict";const BinarySearchTree = require('./BinarySearchTree.js');const Node = require('./Node.js');
function findMin(rootNode){if(rootNode == null)return null;else if(rootNode.leftChild == null)return rootNode.valelsereturn findMin(rootNode.leftChild)} var BST = new BinarySearchTree(6)BST.insertBST(20)BST.insertBST(-1)
console.log(findMin(BST.root))要查看此解決方案的其餘代碼,請轉到Educative.io在嵌入式環境中運行代碼。
問題陳述:實現removeEdge函數以將源和目標作為參數。它應該檢測它們之間是否存在邊緣。這個問題的解決方案非常簡單:我們使用索引和刪除。看一看."use strict";const LinkedList = require('./LinkedList.js');const Node = require('./Node.js');const Graph = require('./Graph.js');function removeEdge(graph, source, dest){if(graph.list.length == 0){return graph; }if(source >= graph.list.length || source < 0){return graph; }if(dest >= graph.list.length || dest < 0){return graph; } graph.list[source].deleteVal(dest);return graph;}let g = new Graph(5);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 3);g.addEdge(2, 4);g.addEdge(4, 0);console.log("Before removing edge")g.printGraph();removeEdge(g, 1, 3);console.log("\nAfter removing edge")g.printGraph();要查看此解決方案的其餘代碼,請轉到Educative.io在嵌入式環境中運行代碼。由於我們的頂點存儲在數組中,因此我們可以訪問源連結列表。然後,我們為連結列表調用delete函數。該解決方案的時間複雜度為O(E),因為我們可能必須遍歷E邊。問題陳述:實現函數convertMax(maxHeap)將二進位最大堆轉換為二進位最小堆。maxHeap應該是maxHeap格式的數組,即父級大於子級。
輸入:最大堆maxHeap = [9,4,7,1,-2,6,5]result = [-2,1,5,9,4,6,7]為了解決這個問題,我們必須最小化所有父節點。看一看。
我們將maxHeap視為常規數組,然後對其重新排序以準確表示最小堆。您可以在上面的代碼中看到完成此操作。然後,convertMax()函數通過調用minHeapify()函數從最低父節點還原所有節點上的堆屬性。關於時間複雜度,此解決方案花費O(nlog(n))O(nlog(n))時間。當涉及到JavaScript中的數據結構時,顯然有很多東西要學習。因此,我們整理了此資源列表,以使您快速了解所需的信息。1、JavaScript ES6教程:刷新您的JavaScript技能,並保持自ES6及更高版本以來的所有新知識更新。(地址:https://www.educative.io/blog/javascript-es6-tutorial-a-complete-crash-course)2、5種為編碼面試做準備的可靠技術:向編碼面試做準備和表演時,向專家學習技巧(地址:https://www.educative.io/blog/5-tried-and-true-techniques-to-prepare-for-a-coding-interview)3、StackOverflow JavaScript數據結構庫:查找有用的庫(例如JSClass,Buckets等)的絕佳資源。(地址:https://stackoverflow.com/questions/5909452/javascript-data-structures-library)1、JavaScript中的數據結構:面試複習:面向所有希望在JavaScript中處理數據結構的人的權威指南。除了詳細審查所有數據結構及其實現之外,它還包含160多個代碼遊樂場和60個動手挑戰。地址:https://www.educative.io/courses/data-structures-in-javascript-an-interview-refresher2、JavaScript中的數據結構-可視化和練習:是否需要更多動手實踐?本課程以簡單的視覺和測驗切入了數據結構問題的核心。地址:https://www.educative.io/courses/data-structures-in-javascript-with-visualizations-and-hands-on-exercises3、掌握JavaScript面試:一旦掌握了數據結構技能,就該刷新有關JS面試的所有知識。本課程包含了所有內容。地址:https://www.educative.io/courses/master-the-javascript-interview1、學習JS數據結構和算法:通過解決明顯的編程問題的解決方案,掌握所有流行的數據結構。英文版地址:https://amzn.to/3dquSVn中文版地址:https://amzn.to/3bnBdPq2、有關數據結構的書籍的免費代碼冠軍列表:跳過搜索,並參考此最有用的JS數據結構和算法推薦書籍清單。圖書清單地址:https://guide.freecodecamp.org/book-recommendations/algorithms-in-js-booksPS:文章在翻譯的時候,內容與標題有些出入,所以做了一些調整。如果想看原文可以到打開原文地址(https://dev.to/educative/7-javascript-data-structures-you-must-know-4k0m)去進行查看,我們所有翻譯類文章,均非採用直譯,主要是便於理解。如有什麼問題,也歡迎交流學習。