數據結構有哪些類型(對于數據結構的簡述)

在學習計算機時,數據結構是不可忽視的一點,從考研時的408課程,再到工作中編寫軟件,網站,要想在計算機領域站住腳跟,數據結構是必備的

在這里,我對于數據結構進行了匯總,并簡要描述,在后面會對各種數據結構進行詳細介紹

在 Java 中,數據結構主要分為兩大類:線性數據結構非線性數據結構。Java 標準庫(如 java.util 包)提供了許多現成的數據結構實現,這些實現基于不同的底層存儲方式和操作特性。以下是對 Java 中常見數據結構的詳細描述:

1. 線性數據結構

線性數據結構是指數據元素之間存在一對一的線性關系。

(1)數組(Array)

數組是一種基本的線性數據結構,用于存儲固定大小的同類型數據元素。

  • 特點

    • 元素存儲在連續的內存空間中。

    • 支持隨機訪問,通過索引可以快速訪問任意位置的元素,時間復雜度為 O(1)。

    • 插入和刪除操作效率較低,通常需要移動大量元素,時間復雜度為 O(n)。

    • 數組的大小在創建后不可變。

  • 示例代碼

  • int[] array = new int[10];
    array[0] = 1;
    array[1] = 2;
    System.out.println(array[0]); // 輸出:1
(2)動態數組(ArrayList)

ArrayList 是 Java 中基于動態數組實現的集合類,它提供了動態擴容的功能。

  • 特點

    • 底層使用數組存儲元素。

    • 支持隨機訪問,時間復雜度為 O(1)。

    • 插入和刪除操作效率較低,時間復雜度為 O(n)。

    • 動態擴容,可以根據需要自動調整數組大小。

  • 示例代碼

  • import java.util.ArrayList;public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);System.out.println(list.get(0)); // 輸出:1list.remove(0);System.out.println(list.get(0)); // 輸出:2}
    }
(3)鏈表(LinkedList)

LinkedList 是 Java 中基于雙向鏈表實現的集合類,它支持高效的插入和刪除操作。

  • 特點

    • 底層使用雙向鏈表存儲元素。

    • 不支持隨機訪問,訪問任意位置的元素需要從頭開始遍歷,時間復雜度為 O(n)。

    • 插入和刪除操作效率較高,時間復雜度為 O(1)。

    • 適合頻繁插入和刪除操作的場景。

  • 示例代碼

  • import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);list.add(2);System.out.println(list.get(0)); // 輸出:1list.remove(0);System.out.println(list.get(0)); // 輸出:2}
    }
(4)棧(Stack)

棧是一種后進先出(LIFO)的數據結構,Java 提供了 Stack 類來實現棧。

  • 特點

    • 支持快速的插入和刪除操作,時間復雜度為 O(1)。

    • 只能在棧頂進行插入和刪除操作。

    • 適合實現函數調用、表達式求值等場景。

  • 示例代碼

  • import java.util.Stack;public class Main {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);System.out.println(stack.pop()); // 輸出:2System.out.println(stack.pop()); // 輸出:1}
    }
(5)隊列(Queue)

隊列是一種先進先出(FIFO)的數據結構,Java 提供了 Queue 接口和多種實現類(如 LinkedListArrayDeque 等)。

  • 特點

    • 支持快速的插入和刪除操作,時間復雜度為 O(1)。

    • 只能在隊尾插入元素,在隊頭刪除元素。

    • 適合實現任務調度、消息隊列等場景。

  • 示例代碼

  • import java.util.LinkedList;
    import java.util.Queue;public class Main {public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();queue.add(1);queue.add(2);System.out.println(queue.poll()); // 輸出:1System.out.println(queue.poll()); // 輸出:2}
    }

2. 非線性數據結構

非線性數據結構是指數據元素之間存在多對多的關系。

(1)樹(Tree)

樹是一種層次化的數據結構,每個節點可以有多個子節點。

  • 常見類型

    • 二叉樹(Binary Tree):每個節點最多有兩個子節點。

    • 二叉搜索樹(Binary Search Tree):左子樹的所有節點值小于根節點值,右子樹的所有節點值大于根節點值。

    • 平衡二叉樹(Balanced Binary Tree):左右子樹的高度差不超過 1。

    • 紅黑樹(Red-Black Tree):一種自平衡的二叉搜索樹。

    • 堆(Heap):一種特殊的完全二叉樹,分為最大堆和最小堆。

  • 示例代碼(二叉樹):

  • class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
    }public class Main {public static void main(String[] args) {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);}
    }
(2)圖(Graph)

圖是一種由節點(頂點)和邊組成的復雜數據結構,節點之間可以存在任意關系。

  • 特點

    • 節點之間通過邊連接,可以是有向邊或無向邊。

    • 支持復雜的遍歷和搜索算法,如深度優先搜索(DFS)和廣度優先搜索(BFS)。

    • 適合表示復雜的關系網絡,如社交網絡、地圖路徑等。

  • 示例代碼(無向圖):

  • import java.util.ArrayList;
    import java.util.List;class Graph {private int vertices;private List<List<Integer>> adjacencyList;public Graph(int vertices) {this.vertices = vertices;this.adjacencyList = new ArrayList<>();for (int i = 0; i < vertices; i++) {adjacencyList.add(new ArrayList<>());}}public void addEdge(int src, int dest) {adjacencyList.get(src).add(dest);adjacencyList.get(dest).add(src); // 無向圖}public void printGraph() {for (int i = 0; i < vertices; i++) {System.out.println("Adjacency list of vertex " + i);System.out.print("head");for (int j : adjacencyList.get(i)) {System.out.print(" -> " + j);}System.out.println();}}
    }public class Main {public static void main(String[] args) {Graph graph = new Graph(5);graph.addEdge(0, 1);graph.addEdge(0, 4);graph.addEdge(1, 2);graph.addEdge(1, 3);graph.addEdge(1, 4);graph.addEdge(2, 3);graph.addEdge(3, 4);graph.printGraph();}
    }
(3)哈希表(Hash Table)

哈希表是一種通過哈希函數將鍵映射到值的數據結構。

  • 特點

    • 提供快速的插入、刪除和查找操作,平均時間復雜度為 O(1)。

    • 哈希函數將鍵映射到存儲位置,可能存在沖突,需要解決沖突的方法(如鏈表法、開放尋址法)。

    • 適合實現字典、緩存等場景。

  • 示例代碼

  • import java.util.HashMap;public class Main {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("Alice", 25);map.put("Bob", 30);System.out.println(map.get("Alice")); // 輸出:25map.remove("Bob");}
    }

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

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

相關文章

L2TP實驗(無圖后補)

拓撲圖 一、搭建拓撲并配置基礎 IP 地址 設備選型與拓撲搭建&#xff1a;在 eNSP 中&#xff0c;拖入所需設備&#xff0c;包括 LAC&#xff08;L2TP Access Concentrator&#xff0c;L2TP 接入集中器 &#xff09;、LNS&#xff08;L2TP Network Server&#xff0c;L2TP 網絡服…

【C#】CAN通信的使用

在C#中實現CAN通信通常需要借助第三方庫或硬件設備的驅動程序&#xff0c;因為C#本身并沒有直接內置支持CAN通信的功能。以下是一個關于如何使用C#實現CAN通信的基本指南&#xff0c;包括所需的步驟和常用工具。 1. 硬件準備 要進行CAN通信&#xff0c;首先需要一個支持CAN協…

02_C++入門案例習題while循環練習案例:猜數字

案例描述&#xff1a;系統隨機生成一個1到100之間的數字&#xff0c;玩家進行猜測&#xff0c;如果猜錯&#xff0c;提示玩家數字過大或過小&#xff0c;如果猜對恭喜玩家勝利&#xff0c;并且退出游戲。 需要引入隨機數種子 #include <cstdlib> #include <ctime>…

深入理解哈希沖突:原理、解決方案及 Java 實踐

概述&#xff1a;在計算機科學領域&#xff0c;哈希表是一種非常重要的數據結構&#xff0c;它通過哈希函數將鍵映射到存儲桶中&#xff0c;從而實現快速的數據查找、插入和刪除操作。然而&#xff0c;哈希表在實際應用中會面臨 哈希沖突的問題。本文將深入探討哈希沖突的原理、…

opencv(C++)處理圖像顏色

文章目錄 介紹使用策略設計模式比較顏色實現方案計算兩個顏色向量之間的距離1. 簡單方法&#xff1a;曼哈頓距離計算&#xff08;Manhattan Distance&#xff09;2.使用 OpenCV 的 cv::norm 函數3.使用 OpenCV 的 cv::absdiff 函數錯誤示例 使用 OpenCV 函數實現顏色檢測實現方…

DOM解析XML:Java程序員的“樂高積木式“數據搭建

各位代碼建筑師們&#xff01;今天我們要玩一個把XML變成內存樂高城堡的游戲——DOM解析&#xff01;和SAX那種"邊看監控邊破案"的刺激不同&#xff0c;DOM就像把整個樂高說明書一次性倒進大腦&#xff0c;然后慢慢拼裝&#xff08;內存&#xff1a;你不要過來啊&…

Apache Nifi安裝與嘗試

Apache NIFI中文文檔 地址&#xff1a;https://nifichina.github.io/ 下載安裝配置 1、環境準備 Nifi的運行需要依賴于java環境&#xff0c;所以本機上需要安裝java環境&#xff0c;并配置環境變量。 1.1查看本機是否已經存在java環境 請先執行以下命令找出系統中真實可用…

我可能用到的網站和軟件

我可能用到的網站和軟件 程序員交流的網站代碼管理工具前端組件庫前端框架在線工具人工智能問答工具學習的網站Windows系統電腦的常用工具 程序員交流的網站 csdn博客博客園 - 開發者的網上家園InfoQ - 軟件開發及相關領域-極客邦掘金 (juejin.cn) 代碼管理工具 GitHub 有時…

使用SSH解決在IDEA中Push出現403的問題

錯誤截圖&#xff1a; 控制臺日志&#xff1a; 12:15:34.649: [xxx] git -c core.quotepathfalse -c log.showSignaturefalse push --progress --porcelain master refs/heads/master:master fatal: unable to access https://github.com/xxx.git/: The requested URL return…

JavaScript異常機制與嚴格模式

目錄 JavaScript 異常機制 1. 基本語法&#xff1a;try...catch...finally 2. 拋出異常&#xff1a;throw 3. 錯誤對象屬性 4. 同步代碼的異常處理 5. 異步代碼的異常處理 5.1 回調函數 5.2 Promise 5.3 全局未捕獲的 Promise 錯誤 6. 全局錯誤處理 7. 自定義錯誤與…

中廠算法崗面試總結

時間&#xff1a;2025.4.10 地點&#xff1a;上市的電子有限公司 面試流程&#xff1a; 1.由負責人講解公司文化 2&#xff0c;由技術人員講解公司的技術崗位&#xff0c;還有成果 3.帶領參觀各個工作位置&#xff0c;還有場所 4.中午吃飯 5.面試題&#xff0c;閉卷考試…

vue+flask圖書知識圖譜推薦系統

文章結尾部分有CSDN官方提供的學長 聯系方式名片 文章結尾部分有CSDN官方提供的學長 聯系方式名片 關注B站&#xff0c;有好處&#xff01; 編號: F025 架構: vueflaskneo4jmysql 亮點&#xff1a;協同過濾推薦算法知識圖譜可視化 支持爬取圖書數據&#xff0c;數據超過萬條&am…

MySQL NDB Cluster詳解

MySQL NDB Cluster&#xff08;MNC&#xff09; 是MySQL提供的一種分布式數據庫解決方案&#xff0c;旨在提供高可用性、高性能的數據庫服務。它通過 NDB&#xff08;Network DataBase&#xff09; 存儲引擎實現了高可用性和分布式存儲&#xff0c;在NDB中&#xff0c;數據通過…

解決華碩主板Z890m下載ubuntu20.04后沒有以太網問題

問題描述&#xff1a; 華碩主板Z890m下載雙系統ubuntu20.04后&#xff0c;發現ubuntu不能打開以太網。 問題原因&#xff1a; 華碩主板的網卡驅動是r8125,而ubuntu20.04的驅動版本是r8169&#xff0c;所以是網卡驅動不匹配造成 解決方案 開機界面按下F2進入BOIS模式&#…

JS里對于集合的簡單介紹

JS的集合 前言一、集合二、基本使用1. 創建集合2. 添加元素3. 刪除元素4. 檢查元素5. 清空集合6. 集合的大小 三、擴展使用1. 遍歷集合2. 從數組創建集合3. 集合的應用場景 四、總結 前言 JS里對于集合的簡單介紹 同數學的集合&#xff0c;有無序性、唯一性 注意&#xff1a;…

pytorch 反向傳播

文章目錄 概念計算圖自動求導的兩種模式 自動求導-代碼標量的反向傳播非標量變量的反向傳播將某些計算移動到計算圖之外 概念 核心&#xff1a;鏈式法則 深度學習框架通過自動計算導數(自動微分)來加快求導。 實踐中&#xff0c;根據涉及號的模型&#xff0c;系統會構建一個計…

Kotlin日常使用函數記錄

文章目錄 前言字符串集合1.兩個集合的差集2.集合轉數組2.1.集合轉基本數據類型數組2.2.集合轉對象數組 Map1.合并Map1.1.使用 操作符1.2.使用 操作符1.3.使用 putAll 方法1.4.使用 merge 函數 前言 記錄一些kotlin開發中&#xff0c;日常使用的函數和方式之類的&#xff0c;…

詳解正則表達式中的?:、?= 、 ?! 、?<=、?<!

1、?: - 非捕獲組 語法: (?:pattern) 作用: 創建一個分組但不捕獲匹配結果&#xff0c;不會將匹配的文本存儲到內存中供后續使用。 優勢: 提高性能和效率 不占用編號&#xff08;不會影響后續捕獲組的編號&#xff09; 減少內存使用 // 使用捕獲組 let regex1 /(hell…

【無標題】spark編程

Value類型&#xff1a; 9) distinct ? 函數簽名 def distinct()(implicit ord: Ordering[T] null): RDD[T] def distinct(numPartitions: Int)(implicit ord: Ordering[T] null): RDD[T] ? 函數說明 將數據集中重復的數據去重 val dataRDD sparkContext.makeRDD(Lis…

GPT-2 語言模型 - 模型訓練

本節代碼是一個完整的機器學習工作流程&#xff0c;用于訓練一個基于GPT-2的語言模型。下面是對這段代碼的詳細解釋&#xff1a; 文件目錄如下 1. 初始化和數據準備 設置隨機種子 random.seed(1002) 確保結果的可重復性。 定義參數 test_rate 0.2 context_length 128 tes…