基础理论
理解算法的概念
算法是带有输入输出的、有限的、确定的、有效的过程。
算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。
特点:
- 执行时,不能包含任何主观的决定;
- 不能有类似直觉/创造力等因素
理解什么是程序,程序与算法的区别和联系
程序是算法用某种程序设计语言的具体实现。
算法和程序的区别主要在于:
- 在语言描述上,程序必须是用规定的程序设计语言来
写,而算法很随意; - 在执行时间上,算法所描述的步骤一定是有限的,而
程序可以无限地执行下去
算法和数据结构的关系
- 广义上讲,算法是一系列的运算步骤,它表达解决某一类计算问题的一般方法,对这类方法的任
何一个输入,它可以按步骤一步一步计算,最终产生一个输出。 - 但是对于所有的计算问题,都离不开要计算的对象或者要处理的信息,而如何高效的把它们组织
起来,就是数据结构关心的问题,所以算法是离不开数据结构的
掌握描述算法的方法
算法的描述方法
- 自然语言
- 流程图
- 程序设计语言:C、C++、Java、Python、…
- 伪代码(Pseudocode)——算法语言
- 类C/类Pascal语言
- 结构化编程语言
掌握算法的计算复杂性概念
问题规模
基本运算
计量函数
用输入规模的某个函数来表示算法的基本运算量,称为算法的时间复杂性(度)
简化算法复杂性分析的方法和步骤,只要考察问题的规模充分大时,算法复杂性在渐近意义下的阶。
掌握算法渐近复杂性的数学表述
渐近上界记号O
- 若存在两个正的常数c和n0 ,使得对所有n≥n0,
都有:T (n)≤c×f(n) ,则称 T (n) = O(f(n))
渐进下界记号 Ω \Omega Ω
- 若存在两个正的常数c和n0 ,使得对所有n≥n0,
都有:T (n)≥c×f(n) ,则称 T (n) = Ω(f(n))
紧渐近界记号 Θ \Theta Θ
- 若存在三个正的常数c1、c2和n0 ,使得对所有n≥n0,都
有:c1×f(n) ≥T (n)≥ c2 f(n) ,则称 T(n) = Θ \Theta Θ(f(n))
证明根据上面定理
了解NP类问题的基本概念
易解问题与难解问题
通常将存在多项式时间算法的问题看作是易解问题(Easy Problem);
- 排序问题、查找问题、欧拉回路
而将需要指数时间算法解决的问题看作是难解问题(Hard Problem)。
- TSP问题、Hanio问题、Hamilton回路问题
不能用计算机求解(不论耗费多少时间)的问题称为不可解问题(Unsolvable Problem)
- 图灵停机问题(Turing Halting Problem)
P类问题和NP类问题
-
判定问题
- 一个判定问题(Decision Problem)是仅仅要求回答“yes”或“no”的问题
判定问题的重要特性——证明比求解易 - 大整数因子
- 复杂线性方程组的解
- 一个判定问题(Decision Problem)是仅仅要求回答“yes”或“no”的问题
-
确定性算法与P类问题
- 定义1 设A是求解问题Π的一个算法,如果在算法的整个执行过程中,每一步只有一个确定的选择,则称算法A是确定性(Determinism)算法
- 定义2 如果对于某个判定问题Π,存在一个非负整数k,对于输入规模为n的实例,能够以 O ( n k ) O(n^k) O(nk)的时间运行一个确定性算法,得到yes或no的答案,则该判定问题Π是一个P类(Polynomial)问题
所有易解问题都是P类问题
-
非确定性算法与NP类问题
- 定义3 设A是求解问题Π的一个算法,如果算法A以如下猜测并验证的方式工作,就称算法A是非确定性(Nondeterminism)算法
- 猜测阶段:在这个阶段,对问题的输入实例产生一个任意字符串y,在算法的每一次运行时,串y的值可能不同,因此,猜测以一种非确定的形式工作;
- 验证阶段:在这个阶段,用一个确定性算法验证:
- 检查在猜测阶段产生的串y是否是合适的形式,如果不是,则算法停下来并得到no;
- 如果串y是合适的形式,则验证它是否是问题的解,如果是,则算法停下来并得到yes,否则算法停下来并得到no。
- 定义4 如果对于某个判定问题Π,存在一个非负整数k,对于输入规模为n的实例,能够以 O ( n k ) O(n^k) O(nk)的时间运行一个非确定性算法,得到yes或no的答案 , 则 该 问 题 是 一 个 NP 类 (Nondeterministic Polynomial)问题
关键:存在一个确定性算法,能够以多项式时间来检查和验证猜测阶段所产生的答案。
例如:NP类问题——汉密尔顿回路问题 - 定义3 设A是求解问题Π的一个算法,如果算法A以如下猜测并验证的方式工作,就称算法A是非确定性(Nondeterminism)算法
P类和NP类问题的主要差别
- P类问题可以用多项式时间的确定性算法来进行判定或求解;
- NP类问题可用多项式时间的非确定性算法来进行判定或求解
- P⊆NP
NP完全问题