Java的数据结构与算法有哪些

发布时间:2021-06-17 18:00:08 作者:chen
来源:亿速云 阅读:137
# Java的数据结构与算法详解

## 目录
1. [数据结构概述](#数据结构概述)
2. [线性数据结构](#线性数据结构)
3. [树形数据结构](#树形数据结构)
4. [图形数据结构](#图形数据结构)
5. [常用算法](#常用算法)
6. [实际应用案例](#实际应用案例)
7. [总结](#总结)

---

## 数据结构概述
数据结构是计算机存储、组织数据的方式,好的数据结构可以带来更高的运行效率和更低的资源消耗。Java作为面向对象语言,提供了丰富的集合框架来实现各种数据结构。

### 基本分类
- **线性结构**:数组、链表、栈、队列
- **树形结构**:二叉树、堆、B树
- **图形结构**:有向图、无向图
- **哈希结构**:哈希表、哈希集合

```java
// Java集合框架继承关系示例
Collection
├── List
│   ├── ArrayList
│   ├── LinkedList
│   └── Vector
├── Set
│   ├── HashSet
│   └── TreeSet
└── Queue
    └── PriorityQueue

线性数据结构

1. 数组(Array)

特点:连续内存空间,固定大小

int[] arr = new int[10];
Arrays.sort(arr);  // 快速排序

时间复杂度: - 访问:O(1) - 插入/删除:O(n)

2. 链表(LinkedList)

类型: - 单向链表 - 双向链表 - 循环链表

LinkedList<String> list = new LinkedList<>();
list.addFirst("Head");  // 头部插入

时间复杂度: - 插入/删除:O(1) - 访问:O(n)

3. 栈(Stack)

LIFO原则(后进先出)

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.pop();

应用场景: - 函数调用栈 - 括号匹配 - 表达式求值

4. 队列(Queue)

FIFO原则(先进先出)

Queue<String> queue = new LinkedList<>();
queue.offer("A");  // 入队
queue.poll();      // 出队

特殊队列: - 双端队列(Deque) - 优先队列(PriorityQueue)


树形数据结构

1. 二叉树

基本概念: - 前序/中序/后序遍历 - 二叉搜索树(BST)

class TreeNode {
    int val;
    TreeNode left, right;
}

2. AVL树

自平衡二叉搜索树,通过旋转保持平衡

3. 红黑树

Java TreeMap/TreeSet底层实现 - 节点为红/黑色 - 根节点为黑 - 红节点的子节点必须为黑

4. 堆(Heap)

完全二叉树,分为最大堆和最小堆

PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());

图形数据结构

存储方式

  1. 邻接矩阵
int[][] graph = new int[V][V];
  1. 邻接表
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(n²) 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);
    }
}

查找算法

  1. 二分查找(要求有序数组)
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];
}

实际应用案例

案例1:LRU缓存

使用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;
    }
}

案例2:文件系统导航

使用树结构模拟目录遍历:

class FileNode {
    String name;
    boolean isDirectory;
    List<FileNode> children;
}

总结

Java提供了强大的集合框架来支持各种数据结构和算法: 1. 选择原则: - 随机访问多 → 数组 - 插入删除多 → 链表 - 需要键值对 → HashMap - 需要排序 → TreeMap

  1. 性能优化

    • 合理选择初始容量
    • 避免频繁扩容
    • 根据场景选择合适算法
  2. 学习建议

    • 理解底层实现原理
    • 多做LeetCode练习
    • 分析JDK源码实现

“程序 = 数据结构 + 算法” —— Niklaus Wirth “`

注:本文为简化版示例,完整6000字版本应包含: 1. 更详细的时间复杂度分析 2. 完整的代码实现示例 3. 算法可视化图解 4. 各数据结构的JDK源码解析 5. 并发场景下的线程安全实现 6. 性能基准测试对比数据 7. 实际工程应用经验分享

推荐阅读:
  1. 手撕数据结构与算法
  2. JS的算法与数据结构的介绍

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:C++中二维数组的地址是如何分布的

下一篇:用 GDB 调试代码的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》