談談常見的數據結構(如數組、鏈表、棧、隊列、哈希表、樹、圖)及其應用場景

一、數組(Array)

定義:連續存儲相同類型數據的線性結構,支持隨機訪問。
應用場景:列表渲染、數據緩存、算法處理
代碼示例

// 數組基本操作
const arr = [1, 2, 3, 4];
arr.push(5); // O(1) 平均時間復雜度
arr.pop();  // O(1)
arr.shift();// O(n) 不推薦高頻使用
arr.unshift(0); // O(n)// 數組遍歷優化
// 推薦寫法(減少屬性查找)
for (let i = 0, len = arr.length; i < len; i++) {console.log(arr[i]);
}// 二維數組初始化
const matrix = Array.from({ length: 3 }, () => new Array(3).fill(0));

使用建議

  1. 優先使用?push/pop?替代?shift/unshift
  2. 大數據量時避免頻繁操作數組頭部
  3. 遍歷數組使用?for?循環而非?forEach?可提高性能
  4. 多維數組建議使用?Array.from?初始化

注意事項

  • 警惕數組越界訪問
  • 避免使用稀疏數組(會影響性能)
  • 注意數組原型鏈方法的副作用(如?sort?會改變原數組)

二、鏈表(Linked List)

定義:由節點組成的鏈式結構,節點包含值和指向下一個節點的指針
應用場景:內存管理、DOM 節點操作、LRU 緩存
代碼示例

class ListNode {constructor(val, next) {this.val = (val === undefined ? 0 : val);this.next = (next === undefined ? null : next);}
}// 鏈表反轉
function reverseList(head) {let prev = null;let current = head;while (current) {const next = current.next;current.next = prev;prev = current;current = next;}return prev;
}

使用建議

  1. 插入 / 刪除操作優先使用鏈表
  2. 實現雙向鏈表時維護好前驅指針
  3. 使用虛擬頭節點簡化邊界條件處理

注意事項

  • 避免循環引用導致內存泄漏
  • 注意空指針檢查
  • 遍歷鏈表時設置終止條件
  • 內存分配比數組更碎片化

三、棧(Stack)

定義:遵循后進先出(LIFO)原則的線性結構
應用場景:路由管理、撤銷重做、函數調用棧
代碼示例

class Stack {constructor() {this.items = [];}push(element) {this.items.push(element);}pop() {return this.items.pop();}peek() {return this.items[this.items.length - 1];}
}// 瀏覽器路由棧模擬
const routerStack = new Stack();
routerStack.push('/home');
routerStack.push('/about');
routerStack.pop(); // 返回 '/about',當前棧頂 '/home'

使用建議

  1. 用數組實現簡單棧時,直接使用?push/pop
  2. 需要高性能時考慮使用?Uint8Array?實現
  3. 限制棧的最大深度防止溢出

注意事項

  • 處理棧溢出(Stack Overflow)
  • 避免在棧中存儲過大對象
  • 遞歸深度受限于棧大小

四、隊列(Queue)

定義:遵循先進先出(FIFO)原則的線性結構
應用場景:任務調度、事件隊列、消息緩沖
代碼示例

class Queue {constructor() {this.items = [];}enqueue(element) {this.items.push(element);}dequeue() {return this.items.shift();}front() {return this.items[0];}
}// 任務隊列處理
const taskQueue = new Queue();
taskQueue.enqueue(() => console.log('Task 1'));
taskQueue.enqueue(() => console.log('Task 2'));
taskQueue.dequeue()(); // 執行 Task 1

使用建議

  1. 優先使用?enqueue?+?pop?替代?shift
  2. 使用雙端隊列(Deque)實現更靈活操作
  3. 限制隊列長度防止內存耗盡

注意事項

  • 避免饑餓問題(高優先級任務阻塞隊列)
  • 處理并發訪問時需加鎖
  • 內存泄漏風險(未及時釋放舊任務)

五、哈希表(Hash Table)

定義:通過哈希函數將鍵映射到存儲位置的結構
應用場景:狀態管理、緩存、快速查找
代碼示例

class HashTable {constructor(size = 1024) {this.table = new Array(size);this.size = size;}hash(key) {let hash = 0;for (let i = 0; i < key.length; i++) {hash += key.charCodeAt(i);}return hash % this.size;}set(key, value) {const index = this.hash(key);this.table[index] = value;}get(key) {const index = this.hash(key);return this.table[index];}
}// 簡單狀態管理
const state = new HashTable();
state.set('user', { name: 'John', age: 30 });
console.log(state.get('user'));

使用建議

  1. 選擇合適的哈希函數(如 BKDRHash)
  2. 負載因子控制在 0.75 以下
  3. 實現沖突解決(開放尋址法 / 鏈地址法)

注意事項

  • 哈希沖突的處理
  • 鍵的可哈希性(對象需重寫 toString)
  • 動態擴容的性能消耗

六、樹(Tree)

定義:n 個節點構成的有限集合,具有層次關系
應用場景:DOM 樹、路由配置、算法優化
代碼示例

class TreeNode {constructor(val) {this.val = val;this.left = null;this.right = null;}
}// 二叉樹前序遍歷
function preorderTraversal(root) {const result = [];function traverse(node) {if (!node) return;result.push(node.val);traverse(node.left);traverse(node.right);}traverse(root);return result;
}// 構建DOM樹
const div = document.createElement('div');
const span = document.createElement('span');
div.appendChild(span);

使用建議

  1. 使用遞歸實現樹遍歷需注意棧溢出
  2. 優先使用迭代法(如 Morris 遍歷)優化空間復雜度
  3. 樹的深度控制在合理范圍

注意事項

  • 樹的平衡問題(AVL 樹 / RBTree)
  • 內存泄漏(未釋放子節點引用)
  • 遍歷順序的選擇(前序 / 中序 / 后序)

七、圖(Graph)

定義:由節點和邊構成的非線性結構
應用場景:社交網絡、路徑規劃、依賴分析
代碼示例

class Graph {constructor() {this.adjList = new Map();}addVertex(vertex) {if (!this.adjList.has(vertex)) {this.adjList.set(vertex, new Set());}}addEdge(v1, v2) {if (this.adjList.has(v1) && this.adjList.has(v2)) {this.adjList.get(v1).add(v2);this.adjList.get(v2).add(v1);}}bfs(start) {const visited = new Set();const queue = [start];visited.add(start);while (queue.length) {const node = queue.shift();console.log(node);this.adjList.get(node).forEach(neighbor => {if (!visited.has(neighbor)) {visited.add(neighbor);queue.push(neighbor);}});}}
}// 頁面依賴關系圖
const graph = new Graph();
graph.addVertex('A');
graph.addVertex('B');
graph.addEdge('A', 'B');
graph.bfs('A'); // 輸出 A -> B

使用建議

  1. 選擇鄰接表存儲稀疏圖
  2. 使用鄰接矩陣存儲稠密圖
  3. 路徑查找使用 Dijkstra/A * 算法

注意事項

  • 圖的遍歷需要標記訪問狀態
  • 處理環的問題(強連通分量)
  • 內存消耗較大,需注意優化

總結建議

  1. 空間與時間權衡:根據數據量和操作類型選擇結構
  2. 性能優化:避免在高頻操作中使用低效率方法
  3. 內存管理:及時釋放不再使用的結構引用
  4. 算法適配:不同場景選擇對應算法(如樹用 DFS,圖用 BFS)
  5. 邊界處理:空值檢查、越界處理等防御性編程

建議在實際開發中建立數據結構選擇決策表,根據具體場景評估時間復雜度、空間復雜度和操作頻率,同時結合瀏覽器 / Node.js 環境特性進行優化。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/74098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/74098.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/74098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kafka 的高可用性

Kafka 的高可用性主要通過副本機制、ISR&#xff08;In-Sync Replicas&#xff09;列表和控制器 Broker 來實現。這些機制共同確保了 Kafka 集群在部分節點故障時仍然可以正常運行&#xff0c;數據不會丟失&#xff0c;并且服務不會中斷。 1. 副本機制 Kafka 的副本機制是其高…

力扣HOT100之矩陣:54. 螺旋矩陣

這道題之前在代碼隨想錄里刷過類似的&#xff0c;還有印象&#xff0c;我就按照當初代碼隨想錄的思路做了一下&#xff0c;結果怎么都做不對&#xff0c;因為按照代碼隨想錄的邊界條件設置&#xff0c;當行數和列數都為奇數時&#xff0c;最后一個元素無法被添加到數組中&#…

快速構建個人本地知識庫管理系統與實現RAG問答

文章目錄 摘要一、RAG 和知識庫簡介1、RAG2、知識庫 二、 工作流程三、系統架構設計文件結構知識庫構建模塊RAG 模塊用戶交互模塊 四、技術實現細節五、系統使用案例結論未來改進方向致謝 摘要 在當今信息爆炸的時代&#xff0c;快速準確地獲取知識變得尤為重要。本地 RAG&…

使用DeepSeek API進行情感分析:超簡單

文章目錄 1. 引言1.1 情感分析概述1.2 為什么選擇DeepSeek API1.3 本文目標 2. 技術方案對比2.1 傳統情感分析方法2.2 基于LLM的方法DeepSeek API優勢 3. DeepSeek 情感分析實戰3.1 Few-shot Learning方法3.2 完整的DeepSeek API調用示例3.3 案例演示 4. DeepSeek開發情感分析工…

設置網站主題色color-scheme

color-scheme color-scheme CSS 屬性允許元素指示它可以舒適地呈現哪些顏色方案。 操作系統顏色方案的常見選擇為“亮色”和“暗色”&#xff0c;或“日間模式”和“夜間模式”。當用戶選擇其中一種顏色方案時&#xff0c;操作系統會對用戶界面進行調整&#xff0c;包括表單控件…

Muduo網絡庫實現 [三] - Socket模塊

目錄 設計思路 類的設計 模塊的實現 基礎模塊 特殊模塊 集成模塊 主函數 主函數實現 主函數測試 疑惑點 設計思路 Socket模塊主要是對套接字的基礎操作進行封裝&#xff0c;簡化我們對套接字的操作&#xff0c;不需要調用C的原生接口&#xff0c;而是以面向對象的…

優選算法的巧思之徑:模擬專題

專欄&#xff1a;算法的魔法世界 個人主頁&#xff1a;手握風云 目錄 一、模擬 二、例題講解 2.1. 替換所有的問號 2.2. 提莫攻擊 2.3. Z字形變換 2.4. 外觀數列 2.5. 數青蛙 一、模擬 模擬算法說簡單點就是照葫蘆畫瓢&#xff0c;現在草稿紙上模擬一遍算法過程&#xf…

貪心算法(13)(java)合并區間

題目&#xff1a; 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&#xff1a; 輸入&#xff…

A股復權計算_權息數據整理

目錄 前置&#xff1a; 步驟&#xff1a; 1 以通達信為參照 2 從優礦獲取所需數據 2.1 股票配股信息 2.2 股票分紅信息 2.3 股票拆股信息 3 合并數據&#xff0c;制成權息數據表 權息數據截止20250329.7z 視頻 前置&#xff1a; 1 本系列將以 “A股復權計算_” 開頭…

學習筆記—數據結構—二叉樹(鏈式)

目錄 二叉樹&#xff08;鏈式&#xff09; 概念 結構 初始化 遍歷 前序遍歷 中序遍歷 后序遍歷 層序遍歷 結點個數 葉子結點個數 第k層結點個數 深度/高度 查找值為x的結點 銷毀 判斷是否為完整二叉樹 總結 頭文件Tree.h Tree.c 測試文件test.c 補充文件Qu…

Open GL ES ->GLSurfaceView在正交投影下的圖片旋轉、縮放、位移

XML文件 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:o…

Day78 | 靈神 | 反轉鏈表 兩兩交換鏈表中的節點

Day78 | 靈神 | 反轉鏈表 兩兩交換鏈表中的節點 24.兩兩交換鏈表中的節點 24. 兩兩交換鏈表中的節點 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 這道題就是下面這道題的k2的情況 25. K 個一組翻轉鏈表 - 力扣&#xff08;LeetCode&#xff09; 基本思路和…

濾波---卡爾曼濾波

卡爾曼濾波概覽 一、定義 卡爾曼濾波是一種基于線性系統和高斯噪聲假設的遞歸最優狀態估計算法。其核心目標是通過融合系統模型預測值與傳感器測量值&#xff0c;在噪聲環境中實時估計系統的動態狀態&#xff08;如位置、速度、加速度等&#xff09;。 數學基礎&#xff1a; …

23種設計模式-結構型模式-橋接器

文章目錄 簡介問題解決方案示例總結 簡介 橋接器是一種結構型設計模式&#xff0c;可將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構&#xff0c;從而能在開發時分別使用。 問題 假如你有一個幾何形狀Shape類&#xff0c;它有兩個子類&#xff1a;圓形C…

手工排查后門木馬的常用姿勢

聲明&#xff01;本文章所有的工具分享僅僅只是供大家學習交流為主&#xff0c;切勿用于非法用途&#xff0c;如有任何觸犯法律的行為&#xff0c;均與本人及團隊無關&#xff01;&#xff01;&#xff01; 1. 檢查異常文件 &#xff08;1&#xff09;查找最近修改的文件 # 查…

工業機器人核心算法體系解析:從感知到決策的技術演進

工業機器人作為智能制造的核心裝備,其技術競爭力的本質是算法體系的優化與創新。從靜態軌跡執行到動態環境適應,從單一任務控制到復雜場景決策,工業機器人的算法體系涵蓋環境感知、運動控制、路徑規劃、行為決策四大核心模塊。本文將深入解析各模塊的關鍵算法及其技術演進,…

當 EcuBus-Pro + UTA0401 遇上 NSUC1500

文章目錄 1.前言2.EcuBus-Pro簡介2.1 官方地址2.2 概覽 3.納芯微NSUC1500簡介3.1 NSUC1500概述3.2 產品特性 4.測試環境5.基礎功能5.1 數據發送5.2 數據監控 6.自動化功能6.1 腳本創建6.2 腳本編輯6.3 腳本編輯與測試 7.音樂律動7.1 導入例程7.2 效果展示 ECB工程 1.前言 最近…

說說Redis的內存淘汰策略?

大家好&#xff0c;我是鋒哥。今天分享關于【說說Redis的內存淘汰策略?】面試題。希望對大家有幫助&#xff1b; 說說Redis的內存淘汰策略? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 Redis的內存淘汰策略用于管理當內存達到最大限制時&#xff0c;如何處理過…

Python實現音頻數字水印方法

數字水印技術可以將隱藏信息嵌入到音頻文件中而不明顯影響音頻質量。下面我將介紹幾種在Python中實現音頻數字水印的方法。 方法一&#xff1a;LSB (最低有效位) 水印 import numpy as np from scipy.io import wavfile def embed_watermark_lsb(audio_path, watermark, ou…

Altium Designer 24 PCB 走線倒圓弧方法

Altium Designer 24 PCB 走線倒圓弧方法 問題描述解決方法設置倒圓弧參數選擇需要優化的走線進行走線優化 優化效果展示 在 PCB 設計中&#xff0c;走線轉角過于尖銳不僅影響美觀&#xff0c;還可能引起信號完整性問題。本文介紹如何在 Altium Designer 24 中通過倒圓弧優化走線…