【數據結構】實現方式、應用場景與優缺點的系統總結

以下是編程中常見的數據結構及其實現方式、應用場景與優缺點的系統總結:


一、線性數據結構

1. 數組 (Array)
  • 定義:連續內存空間存儲相同類型元素。
  • 實現方式
    int[] arr = new int[10]; // Java
    
    arr = [0] * 10  # Python
    
  • 操作
    • 訪問:O(1)(通過索引)
    • 插入/刪除:O(n)(需移動元素)
  • 優點:內存連續,高速緩存友好。
  • 缺點:大小固定,動態擴容成本高。
  • 應用場景:頻繁隨機訪問,如矩陣運算。

2. 鏈表 (Linked List)
  • 定義:通過指針連接的非連續內存節點。
  • 實現方式(單向鏈表):
    class Node {int val;Node next;Node(int val) { this.val = val; }
    }
    Node head = new Node(0); // Java
    
  • 操作
    • 插入/刪除:O(1)(已知位置時)
    • 訪問:O(n)
  • 優點:動態大小,高效插入刪除。
  • 缺點:內存不連續,緩存不友好。
  • 變種:雙向鏈表、循環鏈表。
  • 應用場景:LRU緩存、瀏覽器歷史記錄。

3. 棧 (Stack)
  • 定義:后進先出(LIFO)結構。
  • 實現方式
    • 數組實現:
      stack = []
      stack.append(1)  # Push
      stack.pop()      # Pop (Python)
      
    • 鏈表實現:
      class Stack {Node top;void push(int val) { /* 插入鏈表頭部 */ }int pop() { /* 刪除鏈表頭部 */ }
      }
      
  • 應用場景:函數調用棧、括號匹配。

4. 隊列 (Queue)
  • 定義:先進先出(FIFO)結構。
  • 實現方式
    • 數組實現(循環隊列):
      class CircularQueue {int[] arr;int front, rear, size;// 實現enqueue、dequeue
      }
      
    • 鏈表實現:
      from collections import deque
      q = deque()  # Python雙端隊列
      q.append(1)  # 入隊
      q.popleft()  # 出隊
      
  • 變種:雙端隊列(Deque)、優先隊列(Priority Queue)。
  • 應用場景:任務調度、BFS算法。

二、樹形數據結構

1. 二叉樹 (Binary Tree)
  • 定義:每個節點最多兩個子節點。
  • 實現方式
    class TreeNode {int val;TreeNode left, right;TreeNode(int val) { this.val = val; }
    }
    
  • 變種
    • 二叉搜索樹 (BST):左子樹所有節點值 < 根 < 右子樹。
    • 平衡樹 (AVL/紅黑樹):自動調整高度平衡。
  • 操作:插入/刪除/查找(BST平均 O(log n), 最差 O(n))。

2. 堆 (Heap)
  • 定義:完全二叉樹,滿足堆屬性(最大堆/最小堆)。
  • 實現方式
    • 數組實現:
      # Python heapq模塊(最小堆)
      import heapq
      heap = []
      heapq.heappush(heap, 3)
      heapq.heappop(heap)
      
  • 應用場景:優先隊列、Top K問題。

三、散列表 (Hash Table)

  • 定義:通過哈希函數映射鍵到存儲位置。
  • 實現方式(鏈地址法):
    class HashMap {LinkedList<Entry>[] buckets;class Entry { K key; V value; }void put(K key, V value) { /* 計算哈希并處理沖突 */ }V get(K key) { /* 查找鏈表 */ }
    }
    
  • 操作
    • 平均 O(1)(假設哈希函數均勻)。
    • 最差 O(n)(所有鍵沖突)。
  • 優點:高效查找、插入、刪除。
  • 缺點:內存開銷大,無序。
  • 應用場景:字典、緩存(如Redis)。

四、圖 (Graph)

  • 定義:由頂點和邊組成的非線性結構。
  • 實現方式
    • 鄰接矩陣
      graph = [[0 for _ in range(n)] for _ in range(n)]
      graph[i][j] = weight  # 邊權重
      
    • 鄰接表
      class Graph {List<List<Integer>> adjList;Graph(int n) { adjList = new ArrayList<>(n); }void addEdge(int u, int v) { adjList.get(u).add(v); }
      }
      
  • 應用場景:社交網絡、路徑規劃(Dijkstra算法)。

五、對比總結

數據結構優勢劣勢典型應用
數組快速隨機訪問大小固定,插入刪除慢數值計算
鏈表動態擴展,高效插入刪除隨機訪問慢實現棧/隊列
哈希表平均O(1)操作內存占用大,無序緩存、去重
二叉搜索樹有序數據存儲,查找高效可能退化為鏈表數據庫索引
快速獲取極值僅支持極值訪問任務調度
建模復雜關系算法復雜度高推薦系統

選擇建議

  • 需要快速查詢 → 哈希表。
  • 需要有序數據 → 平衡二叉搜索樹(如TreeMap)。
  • 高頻插入刪除 → 鏈表。
  • 分層處理數據 → 樹(如文件系統)。
  • 數據存在復雜關聯 → 圖。

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

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

相關文章

PyTorch中cdist和sum函數使用示例詳解

以下是PyTorch中cdist與sum函數的聯合使用詳解: 1. cdist函數解析 功能:計算兩個張量間的成對距離矩陣 輸入格式: X1:形狀為(B, P, M)的張量X2:形狀為(B, R, M)的張量p:距離類型(默認2表示歐式距離)輸出:形狀為(B, P, R)的距離矩陣,其中元素 d i j d_{ij} dij?表示…

Ansible配置文件常用選項詳解

Ansible 的配置文件采用 INI 格式&#xff0c;分為多個模塊&#xff0c;每個模塊包含特定功能的配置參數。 以下是ansible.cfg配置文件中對各部分的詳細解析&#xff1a; [defaults]&#xff08;全局默認配置&#xff09; inventory 指定主機清單文件路徑&#xff0c;默認值為 …

了解FTP搜索引擎

根據資料&#xff0c; FTP搜索引擎是專門搜集匿名FTP服務器提供的目錄列表&#xff0c;并向用戶提供文件信息的網站&#xff1b; FTP搜索引擎專門針對FTP服務器上的文件進行搜索&#xff1b; 就是它的搜索結果是一些FTP資源&#xff1b; 知名的FTP搜索引擎如下&#xff0c; …

【大模型面試每日一題】Day 28:AdamW 相比 Adam 的核心改進是什么?

【大模型面試每日一題】Day 28&#xff1a;AdamW 相比 Adam 的核心改進是什么&#xff1f; &#x1f4cc; 題目重現 &#x1f31f;&#x1f31f; 面試官&#xff1a;AdamW 相比 Adam 的核心改進是什么&#xff1f; #mermaid-svg-BJoVHwvOm7TY1VkZ {font-family:"trebuch…

C++系統IO

C系統IO 頭文件的使用 1.使用系統IO必須包含相應的頭文件&#xff0c;通常使用#include預處理指令。 2.頭文件中包含了若干變量的聲明&#xff0c;用于實現系統IO。 3.頭文件的引用方式有雙引號和尖括號兩種&#xff0c;區別在于查找路徑的不同。 4.C標準庫提供的頭文件通常沒…

多模態理解大模型高性能優化丨前沿多模態模型開發與應用實戰第七期

一、引言 在前序課程中&#xff0c;我們系統剖析了多模態理解大模型&#xff08;Qwen2.5-VL、DeepSeek-VL2&#xff09;的架構設計。鑒于此類模型訓練需消耗千卡級算力與TB級數據&#xff0c;實際應用中絕大多數的用戶場景均圍繞推理部署展開&#xff0c;模型推理的效率影響著…

各個網絡協議的依賴關系

網絡協議的依賴關系 學習網絡協議之間的依賴關系具有多方面重要作用&#xff0c;具體如下&#xff1a; 幫助理解網絡工作原理 - 整體流程明晰&#xff1a;網絡協議分層且相互依賴&#xff0c;如TCP/IP協議族&#xff0c;應用層協議依賴傳輸層的TCP或UDP協議來傳輸數據&#…

11.8 LangGraph生產級AI Agent開發:從節點定義到高并發架構的終極指南

使用 LangGraph 構建生產級 AI Agent:LangGraph 節點與邊的實現 關鍵詞:LangGraph 節點定義, 條件邊實現, 狀態管理, 多會話控制, 生產級 Agent 架構 1. LangGraph 核心設計解析 LangGraph 通過圖結構抽象復雜 AI 工作流,其核心要素構成如下表所示: 組件作用描述代碼對應…

相機--基礎

在機器人開發領域&#xff0c;相機種類很多&#xff0c;作為一個機器人領域的開發人員&#xff0c;我們需要清楚幾個問題&#xff1a; 1&#xff0c;相機的種類有哪些&#xff1f; 2&#xff0c;各種相機的功能&#xff0c;使用場景&#xff1f; 3&#xff0c;需要使用的相機…

【備忘】 windows 11安裝 AdGuardHome,實現開機自啟,使用 DoH

windows 11安裝 AdGuardHome&#xff0c;實現開機自啟&#xff0c;使用 DoH 下載 AdGuardHome解壓 AdGuardHome啟動 AdGuard Home設置 AdGuardHome設置開機自啟安裝 NSSM設置開機自啟重啟電腦后我們可以訪問 **http://127.0.0.1/** 設置使用 AdGuardHome DNS 效果圖 下載 AdGua…

安裝部署配置jenkins

隨著現代軟件開發流程的不斷演進,持續集成(CI)和持續交付(CD)已經成為了開發團隊必不可少的工具。而Jenkins作為最為廣泛應用的CI/CD工具,能夠自動化執行構建、測試、部署等任務。Maven作為Java生態中廣泛使用的構建工具,它能夠幫助開發人員自動化管理項目的構建、依賴和…

How to balance work and personal life?

How to balance work and personal life? 1. Background2. How to balance work and personal life?References 1. Background Let me introduce /??ntr??dju?s/ the background /?bkɡra?nd/ first. Today we will talk about this topic: How to balance work and …

存儲引擎系列--LSM的Compaction研究方法論

本文主要包含以下內容: 1、Compaction 設計空間的四個原語:觸發器、數據布局、壓縮粒度、數據移動策略。任何已有的compaction策略和新的策略都可以由這個四個原語組建構成。 2、詳細介紹這四個原語的定義,策略方法 3、現有的基于LSM的知名系統的compaction策略按照四個原語…

關系數據庫基礎入門

關系數據庫概述 相關名詞 1、關系&#xff1a;在關系數據庫中&#xff0c;實體以及實體間的聯系都是用關系來表示的。類似于程序設計語言中變量的概念。 2、關系模式&#xff1a;是對關系的描述。類似于程序設計語言中類型定義的概念。 3、關系模型&#xff1a;是由若干個關系…

圖解BERT

圖解 Bert 大家可以訪問 圖解Bert 獲取更加優質的閱讀體驗。 圖解BERT一文還在持續更新中。 環境搭建 按序執行以下命令完成環境搭建: git clone https://github.com/DA-southampton/Read_Bert_Code.git cd Read_Bert_Code conda create -n Read_Bert_Code python3.9.22 co…

【HarmonyOS 5】鴻蒙中的UIAbility詳解(一)

【HarmonyOS 5】鴻蒙中的UIAbility詳解&#xff08;一&#xff09; 一、UIAbility是什么&#xff1f; Stage模型中的組件類型名&#xff0c;即UIAbility組件&#xff0c;包含UI&#xff0c;提供展示UI的能力&#xff0c;主要用于和用戶交互。 UIAbility類似于傳統移動開發An…

Transformer預訓練模型微調技術全解析

引言:Transformer預訓練模型與微調的浪潮 近年來,人工智能領域取得了令人矚目的成就,特別是在自然語言處理(NLP)方面。引領這場變革的核心技術之一便是Transformer架構。自2017年 Vaswani 等人在論文 "Attention Is All You Need" 中提出以來,Transformer憑借…

《算法筆記》12.2小節——字符串專題->KMP算法 問題 C: 剪花布條

題目描述 一塊花布條&#xff0c;里面有些圖案&#xff0c;另有一塊直接可用的小飾條&#xff0c;里面也有一些圖案。對于給定的花布條和小飾條&#xff0c;計算一下能從花布條中盡可能剪出幾塊小飾條來呢&#xff1f; 輸入 輸入中含有一些數據&#xff0c;分別是成對出現的…

實現一個前端動態模塊組件(Vite+原生JS)

1. 引言 在前面的文章《使用Vite創建一個動態網頁的前端項目》中我們實現了一個動態網頁。不過這個動態網頁的實用價值并不高&#xff0c;在真正實際的項目中我們希望的是能實現一個動態的模塊組件。具體來說&#xff0c;就是有一個頁面控件同時在多個頁面中使用&#xff0c;那…

NTFS0x90屬性和0xa0屬性和0xb0屬性的一一對應關系是index_entry中的index_node中VCN和runlist和bitmap

第一部分&#xff1a; 0: kd> dt _FILE_RECORD_SEGMENT_HEADER 0xc1241400 Ntfs!_FILE_RECORD_SEGMENT_HEADER 0x000 MultiSectorHeader : _MULTI_SECTOR_HEADER 0x008 Lsn : _LARGE_INTEGER 0x80e74aa 0x010 SequenceNumber : 5 0x012 Referen…