第1章引言

第1章:引言

1.1 算法与问题的定义

算法的定义

  • 算法是解决问题的一组明确的指令或步骤,用于将输入转换为输出。
  • 一个好的算法应该具备清晰的正确性、效率和可理解性。

算法的三个主要方面

  1. 输入:算法接受的初始数据。
  2. 输出:算法计算后的结果。
  3. 过程:算法执行的步骤。

1.2 算法的特性

正确性

  • 一个算法必须在所有输入情况下产生正确的输出。

效率

  • 主要指算法的时间复杂度和空间复杂度。
  • 时间复杂度:执行步骤的数量。
  • 空间复杂度:算法需要的额外内存。

可理解性

  • 算法应该易于理解和实现。

1.3 算法分析的基本方法

时间复杂度分析

  • 时间复杂度用来衡量算法执行所需的时间量,通常用大O符号表示,如O(n)、O(log n)、O(n²)等。
  • 通过分析基本操作的执行次数来估计时间复杂度。 大O符号(Big O):表示算法在最坏情况下的时间增长率。

空间复杂度分析

  • 空间复杂度衡量的是算法在执行过程中所占用的内存。
  • 类似于时间复杂度,也使用大O符号来表示。

1.4 常见算法的分析实例

顺序查找

  • 给定一个线性列表,寻找一个特定的元素。
  • 时间复杂度是O(n),因为需要检查每个元素。

二分查找

  • 在已排序的数组中查找元素,通过每次将搜索区间折半来优化搜索。
  • 时间复杂度是O(log n)。

1.5 数学基础

常见数学概念

对数函数:logarithms,主要用来表示算法的对数时间复杂度。

指数函数:exponential functions,常见于某些暴力搜索算法的分析中。

数学技巧

求和公式:掌握一些常见的求和公式,比如算术级数和几何级数的求和。

不等式:常用的数学不等式,如Cauchy-Schwarz不等式,帮助分析复杂度。

1.6 算法设计策略

分治法

  • 将一个大问题分解成若干小问题,递归求解后再合并结果。
  • 示例:归并排序、快速排序。 动态规划

  • 将复杂问题分解为子问题,并通过保存子问题的解来避免重复计算。

  • 示例:背包问题、最短路径问题。 贪心算法

  • 每次选择当前看似最优的解,尽量优化局部结果,逐步逼近全局最优。

  • 示例:最小生成树(Kruskal、Prim算法)。

1.7 算法的伪代码与实现

伪代码

  • 伪代码是一种简化的程序语言,用来描述算法的步骤,避免与具体编程语言的细节相关联。
  • 目的是帮助理解算法的核心思想。 代码实现

  • 学习如何将伪代码转化为实际的编程代码(如Python、C++等)。