# Java的數據結構與算法詳解
## 目錄
1. [數據結構概述](#數據結構概述)
2. [線性數據結構](#線性數據結構)
3. [樹形數據結構](#樹形數據結構)
4. [圖形數據結構](#圖形數據結構)
5. [常用算法](#常用算法)
6. [實際應用案例](#實際應用案例)
7. [總結](#總結)
---
## 數據結構概述
數據結構是計算機存儲、組織數據的方式,好的數據結構可以帶來更高的運行效率和更低的資源消耗。Java作為面向對象語言,提供了豐富的集合框架來實現各種數據結構。
### 基本分類
- **線性結構**:數組、鏈表、棧、隊列
- **樹形結構**:二叉樹、堆、B樹
- **圖形結構**:有向圖、無向圖
- **哈希結構**:哈希表、哈希集合
```java
// Java集合框架繼承關系示例
Collection
├── List
│ ├── ArrayList
│ ├── LinkedList
│ └── Vector
├── Set
│ ├── HashSet
│ └── TreeSet
└── Queue
└── PriorityQueue
特點:連續內存空間,固定大小
int[] arr = new int[10];
Arrays.sort(arr); // 快速排序
時間復雜度: - 訪問:O(1) - 插入/刪除:O(n)
類型: - 單向鏈表 - 雙向鏈表 - 循環鏈表
LinkedList<String> list = new LinkedList<>();
list.addFirst("Head"); // 頭部插入
時間復雜度: - 插入/刪除:O(1) - 訪問:O(n)
LIFO原則(后進先出)
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.pop();
應用場景: - 函數調用棧 - 括號匹配 - 表達式求值
FIFO原則(先進先出)
Queue<String> queue = new LinkedList<>();
queue.offer("A"); // 入隊
queue.poll(); // 出隊
特殊隊列: - 雙端隊列(Deque) - 優先隊列(PriorityQueue)
基本概念: - 前序/中序/后序遍歷 - 二叉搜索樹(BST)
class TreeNode {
int val;
TreeNode left, right;
}
自平衡二叉搜索樹,通過旋轉保持平衡
Java TreeMap/TreeSet底層實現 - 節點為紅/黑色 - 根節點為黑 - 紅節點的子節點必須為黑
完全二叉樹,分為最大堆和最小堆
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
int[][] graph = new int[V][V];
List<List<Integer>> adj = new ArrayList<>();
// DFS示例
void dfs(int v, boolean[] visited) {
visited[v] = true;
for (int neighbor : adj.get(v)) {
if (!visited[neighbor]) {
dfs(neighbor, visited);
}
}
}
算法 | 時間復雜度 | 空間復雜度 | 穩定性 |
---|---|---|---|
冒泡排序 | O(n2) | O(1) | 穩定 |
快速排序 | O(nlogn) | O(logn) | 不穩定 |
歸并排序 | O(nlogn) | O(n) | 穩定 |
// 快速排序實現
void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi-1);
quickSort(arr, pi+1, high);
}
}
int binarySearch(int[] arr, int target) {
int left = 0, right = arr.length-1;
while (left <= right) {
int mid = left + (right-left)/2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid+1;
else right = mid-1;
}
return -1;
}
典型問題: - 背包問題 - 最長公共子序列 - 斐波那契數列
// 斐波那契DP解法
int fib(int n) {
int[] dp = new int[n+1];
dp[0] = 0; dp[1] = 1;
for (int i=2; i<=n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
使用LinkedHashMap實現:
class LRUCache extends LinkedHashMap<Integer, Integer> {
private int capacity;
public LRUCache(int capacity) {
super(capacity, 0.75f, true);
this.capacity = capacity;
}
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > capacity;
}
}
使用樹結構模擬目錄遍歷:
class FileNode {
String name;
boolean isDirectory;
List<FileNode> children;
}
Java提供了強大的集合框架來支持各種數據結構和算法: 1. 選擇原則: - 隨機訪問多 → 數組 - 插入刪除多 → 鏈表 - 需要鍵值對 → HashMap - 需要排序 → TreeMap
性能優化:
學習建議:
“程序 = 數據結構 + 算法” —— Niklaus Wirth “`
注:本文為簡化版示例,完整6000字版本應包含: 1. 更詳細的時間復雜度分析 2. 完整的代碼實現示例 3. 算法可視化圖解 4. 各數據結構的JDK源碼解析 5. 并發場景下的線程安全實現 6. 性能基準測試對比數據 7. 實際工程應用經驗分享
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。