008 【入门】算法和数据结构简介

发布于:2025-06-28 ⋅ 阅读:(16) ⋅ 点赞:(0)

算法与数据结构系统概览 | [算法]-[基础]-[通用]

一、算法分类与应用

1. 硬计算类算法 | [算法]-[中级]-[通用]

特点 应用场景 复杂度特征
- 精确求解问题
- 可能带来较高计算复杂度
- 大厂笔试/面试
- ACM竞赛
- 所有程序员岗位必考
⏱️ 通常为 O(n)~O(n²)
// [示例] 快速排序算法 - 分治思想核心实现
public void quickSort(int[] arr, int left, int right) {
    if (left < right) {
        // [关键] 随机选择基准点可避免最坏情况
        int pivotIndex = partition(arr, left, right);
        quickSort(arr, left, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, right);
    }
}

2. 软计算类算法 | [算法]-[高级]-[AI/机器学习]

特点 应用场景 复杂度特征
- 逼近解而非精确解
- 计算时间可控
- 算法工程师额外掌握
- 机器学习/AI领域
⏱️ 通常为多项式时间
# [示例] 梯度下降算法 - 机器学习基础优化方法
def gradient_descent(X, y, theta, alpha, iterations):
    m = len(y)  # 样本数
    cost_history = []
    
    for i in range(iterations):
        # [关键] 向量化计算提高效率
        prediction = X.dot(theta)
        error = prediction - y
        gradient = X.T.dot(error) / m
        theta = theta - alpha * gradient  # 更新参数
        
        # 记录代价函数
        cost = (1/(2*m)) * np.sum(np.square(error))
        cost_history.append(cost)
    
    return theta, cost_history

二、数据结构底层分类

1. 连续结构 | [数据结构]-[基础]-[存储]

核心原理 常见结构 优缺点
内存物理连续存储 数组、顺序栈、队列 ✅ 随机访问快 O(1)
❌ 插入删除慢 O(n)
// [示例] 数组实现的栈 - 连续存储结构典型应用
public class ArrayStack<T> {
    private Object[] elements; // [核心] 连续内存存储
    private int size;
    
    public ArrayStack(int capacity) {
        elements = new Object[capacity];
        size = 0;
    }
    
    public void push(T item) {
        // [警告] 未检查栈溢出 → 应添加扩容机制
        elements[size++] = item;
    }
    
    @SuppressWarnings("unchecked")
    public T pop() {
        if (isEmpty()) throw new EmptyStackException();
        T item = (T) elements[--size];
        elements[size] = null; // 避免内存泄漏
        return item;
    }
    
    public boolean isEmpty() {
        return size == 0;
    }
}

2. 跳转结构 | [数据结构]-[中级]-[引用]

核心原理 常见结构 优缺点
通过指针/引用逻辑关联 链表、二叉树、哈希表 ✅ 插入删除快 O(1)
❌ 随机访问慢 O(n)
// [示例] 二叉树的层序遍历 - BFS通用模板
// ▶ JDK8+
public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();
    Queue<TreeNode> queue = new LinkedList<>();
    
    if (root != null) queue.offer(root);
    
    while (!queue.isEmpty()) {
        int levelSize = queue.size();
        List<Integer> level = new ArrayList<>();
        
        for (int i = 0; i < levelSize; i++) {
            TreeNode node = queue.poll();
            level.add(node.val);
            
            // [关键] 按层扩展
            if (node.left != null) queue.offer(node.left);
            if (node.right != null) queue.offer(node.right);
        }
        
        res.add(level);
    }
    
    return res;
}

3. 高阶数据结构 | [数据结构]-[高级]-[竞赛]

结构名称 核心应用 复杂度
可持久化线段树 区间查询与历史版本 ⏱️ 构建 O(n log n),查询 O(log n)
树链剖分 树上路径操作 ⏱️ 预处理 O(n),查询 O(log n)
后缀数组 字符串匹配 ⏱️ 构建 O(n log n),查询 O(m log n)

三、关键结论与实战应用

1. 硬计算类算法是程序员的通用基础

  • 所有技术岗(前端/后端/算法)必须掌握
  • 决定代码核心效率的基石
相互支撑
进阶提升
实际场景
性能优化
基础算法
数据结构
高级算法
工程应用

2. 数据结构本质是两大结构的组合

任何数据结构 = 连续结构 + 跳转结构
↑↑↑
没有例外(从链表到后缀数组均遵循此规律)

技术决策树

需要随机访问
需要频繁增删
选择数据结构
连续结构为主
跳转结构为主
数组/向量
矩阵
链表
树形结构
二叉树
多叉树
平衡树
红黑树
AVL树

3. 算法工程师的进阶能力

  • 硬计算类:解决精确问题(如:LeetCode题目)
  • 软计算类:处理现实复杂问题(如:推荐系统/图像识别)

四、学习路径与工具

1. 学习建议

  • 优先掌握硬计算类算法,再拓展软计算应用
  • 数据结构需理解组合本质而非死记硬背
  • 通过实战题目巩固理论知识

🚀 效率工具VisuAlgo - 数据结构和算法可视化学习平台

视频链接

左老师视频


网站公告

今日签到

点亮在社区的每一天
去签到