小白算法集训营-大幅提升刷题量,快速逃离新手区(完结)
`小白算法集训营-大幅提升刷题量,快速逃离新手区 --- “夏のke” ---jzit--.--top/1857/
Java数据结构与算法核心知识体系
一、数据结构
1. 数组(Array)
-
特点:连续内存空间、固定大小、随机访问O(1)
-
操作:
java
复制
int[] arr = new int[10]; // 初始化arr[0] = 5; // 赋值int len = arr.length; // 获取长度 -
应用场景:频繁随机访问、数据量固定
2. 链表(Linked List)
-
类型:单链表、双链表、循环链表
-
特点:非连续存储、动态大小、插入删除O(1)
-
Java实现:
java
复制
class ListNode { int val; ListNode next; ListNode(int x) { val = x; }} -
应用场景:频繁插入删除、实现栈/队列
3. 栈(Stack)
-
特点:LIFO(后进先出)
-
Java实现:
java
复制
Stack<Integer> stack = new Stack<>();stack.push(1); // 入栈int top = stack.pop(); // 出栈 -
应用场景:函数调用、表达式求值、括号匹配
4. 队列(Queue)
-
类型:普通队列、双端队列、优先队列
-
特点:FIFO(先进先出)
-
Java实现:
java
复制
Queue<Integer> queue = new LinkedList<>();queue.offer(1); // 入队int head = queue.poll(); // 出队 -
应用场景:BFS、任务调度
5. 哈希表(Hash Table)
-
特点:键值对存储、平均O(1)访问
-
Java实现:
java
复制
Map<String, Integer> map = new HashMap<>();map.put("key", 1); // 插入int value = map.get("key"); // 查找 -
应用场景:快速查找、去重
6. 树(Tree)
- 常见类型:
-
- 二叉树:每个节点最多两个子节点
- 二叉搜索树(BST):左<根<右
- AVL树/红黑树:自平衡二叉搜索树
- 堆:完全二叉树,用于优先队列
- 遍历方式:前序、中序、后序、层序
- 应用场景:文件系统、数据库索引
7. 图(Graph)
- 表示方法:邻接矩阵、邻接表
- 算法:DFS、BFS、Dijkstra、Prim、拓扑排序
- 应用场景:社交网络、路径规划
二、算法原理
1. 排序算法
快速排序示例:
java
复制
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); }}
2. 查找算法
-
顺序查找:O(n)
-
二分查找:O(logn)(要求有序)
java
复制
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;}
3. 递归与动态规划
-
递归:函数调用自身,需有终止条件
java
复制
int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n-1) + fibonacci(n-2);} -
动态规划:将问题分解为子问题,避免重复计算
java
复制
int fibDP(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];}
4. 贪心算法
- 特点:局部最优解希望导致全局最优
- 应用场景:霍夫曼编码、最小生成树
5. 回溯算法
-
特点:试探性搜索,不满足条件时回退
-
框架:
java
复制
void backtrack(路径, 选择列表) { if (满足结束条件) { 结果.add(路径); return; } for (选择 : 选择列表) { 做选择; backtrack(路径, 选择列表); 撤销选择; }}
三、复杂度分析
1. 时间复杂度
- 常见复杂度:
-
- O(1):常数时间
- O(logn):对数时间(二分查找)
- O(n):线性时间(遍历)
- O(nlogn):快速排序
- O(n²):冒泡排序
- O(2ⁿ):指数时间(递归斐波那契)
- 分析方法:
-
- 关注最坏情况
- 忽略低阶项和常数系数
- 递归算法使用主定理分析
2. 空间复杂度
- 算法运行所需额外空间
- 示例:
-
- 快速排序:O(logn)递归栈空间
- 归并排序:O(n)合并空间
3. 复杂度优化策略
- 时间换空间:缓存计算结果
- 空间换时间:使用哈希表加速查找
- 分治策略:将问题分解为更小规模
掌握这些数据结构和算法知识,能够帮助开发者编写更高效、更优雅的Java代码,有效解决各种复杂的编程问题。