1.算法的定义
给定计算问题,算法是一系列良定义的计算步骤,逐一执行计算步骤即可得到预期的输出。
2.算法的性质
(1)有穷性:算法必须在有限个计算步骤后终止
反例:给定输入数组,不断交换首尾元素的位置。
正例:选择排序
- 第一次遍历找到数组中的最小元素
- 第二次在剩余数组中遍历找到次小元素
- ...
- 第n次在剩余数组中遍历找到第n小元素
- 直至剩余数组为0,即为有序数组
(2)确定性:算法必须是没有歧义的
反例:对于给定输入数组,交换两个数的位置。
正例:选择排序
(3)可行性:可以机械地一步一步执行基本操作步骤
反例:将大元素放数组后部,小元素放数组前部。
正例:选择排序
3.算法的表示
3.1.自然语言
(1)方法优势
- 贴近人类思维,易于理解主旨
(2)不便之处
- 语言描述繁琐,容易产生歧义
- 使用了“...”等不严谨的描述
3.2.编程语言
(1)方法优势
- 精准表达逻辑,规避表述歧义
(2)不便之处
- 不同编程语言间语法存在差异
- 过于关注算法实现的细枝末节
3.3.伪代码
(1)非正式语言
- 移植编程语言书写形式作为基础和框架
- 按照接近自然语言的形式表达算法过程
(2)兼顾自然语言与编程语言优势
- 简洁表达算法本质,不拘泥于实现细节
- 准确反映算法过程,不产生矛盾和歧义
例:
4.算法的分析
4.1.算法分析的原则
(1)统一机器性能
- 统一机器性能后,算法运行时间依赖于问题输入规模与实例
- 相同输入规模,实例影响运行
(2)常用最坏情况分析算法运行时间
输入情况 | 情况说明 |
最好情况 | 不常出现,不具普遍性 |
最坏情况 | 确定上界,更具一般性 |
一般情况 | 情况复杂,分析难度大 |
算法运行时间仅依赖于问题输入规模𝒏,表示为𝑻(𝒏)
(3)采用渐进分析
4.2.算法分析的工具
(1)渐近分析:忽略𝑻(𝒏)的系数与低阶项,仅关注高阶项,用记号𝚯表示
(2)渐进记号:分析𝒏充分大时函数的大小关系,并用渐近记号表示
渐进记号 | 名称 |
𝑻 𝒏 = 𝚯(𝒈(𝒏)) | 渐进紧确界 |
𝑻 𝒏 = 𝑶(𝒈(𝒏)) | 渐进上界 |
𝑻 𝒏 = 𝛀(𝒈(𝒏)) | 渐进下界 |
𝚯记号(渐进紧确界)
定义:
- 对于给定的函数𝒈(𝒏),𝚯(𝒈(𝒏))表示以下函数的集合: 𝚯 𝒈 𝒏 = {𝑻 𝒏 : ∃ 𝒄𝟏, 𝒄𝟐, 𝒏𝟎 > 𝟎, 使得∀ 𝒏 ≥ 𝒏𝟎, 𝒄𝟏𝒈 𝒏 ≤ 𝑻 𝒏 ≤ 𝒄𝟐𝒈(𝒏)}
𝑶记号(渐进上界)
定义:
- 对于给定的函数𝒈(𝒏),𝑶(𝒈(𝒏))表示以下函数的集合: 𝑶 𝒈 𝒏 = {𝑻 𝒏 : ∃ 𝒄, 𝒏𝟎 > 𝟎, 使得∀ 𝒏 ≥ 𝒏𝟎, 𝟎 ≤ 𝑻 𝒏 ≤ 𝒄𝒈 𝒏 }
𝛀记号(渐进下界)
定义:
- 对于给定的函数𝒈(𝒏),𝛀(𝒈(𝒏))表示以下函数的集合: 𝛀 𝒈 𝒏 = {𝑻 𝒏 : ∃ 𝒄, 𝒏𝟎 > 𝟎, 使得∀ 𝒏 ≥ 𝒏𝟎, 𝟎 ≤ 𝒄𝒈 𝒏 ≤ 𝑻 𝒏 }