跳转至

算法概述

什么是算法?

算法 (Algorithm) 是解决特定问题的一系列定义明确的指令。就像菜谱教你如何做菜一样,算法教计算机如何处理数据、执行计算或完成自动化推理任务。

算法的五大特性:

  1. 有穷性 (Finiteness): 算法必须在有限步骤内结束。
  2. 确定性 (Definiteness): 每一步都有确切的含义,无二义性。
  3. 输入 (Input): 有 0 个或多个输入。
  4. 输出 (Output): 至少有一个输出。
  5. 可行性 (Effectiveness): 每一步都是可执行的。

时间复杂度与空间复杂度

我们用 大 O 表示法 (Big O Notation) 来衡量算法的优劣。

1. 时间复杂度 (Time Complexity)

衡量算法运行时间随数据规模 (\(n\)) 增长的变化趋势。

复杂度 名称 举例 说明
\(O(1)\) 常数阶 访问数组元素 arr[i] 最快,与 \(n\) 无关
\(O(\log n)\) 对数阶 二分查找 每次减半,非常快
\(O(n)\) 线性阶 遍历数组 \(n\) 线性增长
\(O(n \log n)\) 线性对数阶 快速排序、归并排序 大多数高效排序的极限
\(O(n^2)\) 平方阶 冒泡排序、双重循环 \(n=10^4\) 时通常超时
\(O(2^n)\) 指数阶 递归求解斐波那契 极慢,仅适用于极小 \(n\)
\(O(n!)\) 阶乘阶 旅行商问题暴力解 最慢

2. 空间复杂度 (Space Complexity)

衡量算法在运行过程中临时占用的存储空间大小。

  • \(O(1)\): 原地操作,不需要额外空间。
  • \(O(n)\): 需要开辟一个长度为 \(n\) 的辅助数组。
  • \(O(\log n)\): 递归调用栈的深度(如归并排序)。

算法评估技巧

在一般的算法竞赛或工程面试中,计算机 1 秒钟大约能执行 \(10^8\) (1 亿) 次基本运算。

  • \(N \le 10^6\),算法最好是 \(O(n)\)\(O(n \log n)\)
  • \(N \le 10^4\),算法可以是 \(O(n^2)\)
  • \(N \le 20\),算法可以是 \(O(2^n)\)

常用数据结构回顾

算法离不开数据结构,选择合适的数据结构往往能将时间复杂度从 \(O(n^2)\) 降为 \(O(n \log n)\)

  • 数组 (Array): 随机访问 \(O(1)\),插入删除 \(O(n)\)
  • 链表 (Linked List): 插入删除 \(O(1)\),随机访问 \(O(n)\)
  • 栈 (Stack): 先进后出 (LIFO),DFS 基础。
  • 队列 (Queue): 先进先出 (FIFO),BFS 基础。
  • 哈希表 (Hash Map): 查找、插入、删除平均 \(O(1)\)
  • 堆 (Heap/Priority Queue): 始终能快速(\(O(1)\))获得最大/最小值。

下一章:模拟与枚举