算法设计
数据结构
前边的常规数据结构
链表、堆栈和队列看了也记不住,知道意思用到了再看看。
树
树
- 一棵树有一个根节点,根节点没有父节点
- 其余节点可以分成m个互不相交的集合 T0,T1,...Tn−1 T 0 , T 1 , . . . T n − 1 ,每个集合也是一棵树,成为根节点的子树
- 没有子节点的节点叫叶节点
- 节点的子树个数叫做节点的度(degree)
二叉树
二叉树是指每个节点最多有两个子节点的树,其中第一和第二个子节点的分别叫做左子节点右子节点,对应的子树分别叫做左子树和右子树。
堆
堆是一种特殊的完全二叉树,它要求节点中的存储的元素类型可比较,且任意一个节点中的元素都不大于其子节点的元素。
图
图是指由若干定点和连接其中某些顶点的边所组成的图形,一个图经常可记录为
G=<V,E>
G
=<
V
,
E
>
,其中V表示顶点的集合,
E={(u,v)|u,v∈V}
E
=
{
(
u
,
v
)
|
u
,
v
∈
V
}
表示边的集合。
- 从顶点到自身的边成为自环,连接相同顶点的两条边成为平行边,没有自环和平行边的图称为简单图,除非特别声明,一般所指的图都是简单图。
- 如果
(u,v)∈E
(
u
,
v
)
∈
E
,那么
u,v
u
,
v
互为邻接顶点,边
(u,v)
(
u
,
v
)
与顶点
u
u
和互相关联。顶点
u
u
的度指与相关联的边的数量。
- 从某一个顶点出发,如果经过一系列的边可以到达另一个顶点,则两个顶点是连通的,经过的序列成为路径。
- 如果路径不存在重复的顶点,那么称这样的路径为简单路径。
- 如果图中任意两个顶点之间都有路径,那么称图为连通图。
- 如果图中的每条边都是无向的,那么该图叫做无向图,如果每条边都是有向的,那么该图叫做有向图。
- 如果给图中的每条边赋予一个权值,那么称这样的图叫做加权图。
蛮力法
什么叫蛮力法
蛮力法(Brute Force)就是穷尽所有可能的情况来寻找问题的解。
冒泡排序
大元素不断向数组尾部移动的过程类似于水中气泡上升的过程,因此该算法叫冒泡排序算法。
递归与分治法
树与图中的一些递归问题
二叉树的遍历
二叉树的递归算法:二叉树的前序遍历结果,其中每个节点应出现在其子节点之前,且左子节点出现在右子节点之前。
Algorithm RecPreOrder(root:BTreeNode<T>)
begin
if (root = null) then return 1;
return root.value @ RecPreOrder(root.left) @ RecPreOrder(root.right);
end
分治法的基本思想
- 将原问题分解成若干个规模较小的问题
- 对这些子问题分别进行合并
- 对各个子问题的解进行合并,从而得到原问题的解
动态规划法
基本思想
先将问题分解,然后在对这些较小的子问题求解,将问题结果记录,在以后的计算过程中遇到相同的子问题就直接读取其结果。
贪心算法
基本思想
将眼前的利益最大化,找到每一步的最优解
可解决的问题
找零钱问题,最大数量装载问题,最小生成树、单源最短路径、往返运输问题、区间活动安排问题、哈夫曼树。
回溯与分支限界
基本思想
状态空间
在解决问题时,我们都需要先定义解的表示形式,一遍对问题的搜索空间(也叫状态空间)进行刻画,给定一个问题实例,其所有可能解构成了问题的完整状态空间。
状态空间树
为了改进蛮力法,一般应按照一定方式来对问题的状态空间进行组织,一遍在搜索过程中应用一些策略来避免无效搜索,加速求解过程,最常见的就是状态空间树。
按照树结构的形式对问题的状态空间进行组织,这就是状态空间树。书中的每个节点对应问题求解过程中的一个状态。
迭代改进算法
暂时用不到
计算复杂性与NP理论
暂时用不到
近似算法
暂时用不到
参数化算法
暂时用不到
随机算法
随机算法的含义
随机算法的特点是允许算法在执行过程中随机的选择下一个计算步骤,随机算法的特点是,对于同一种问题实例,多次运行同一种算法可能得到不同的结果。随机算法的运行结果大致有以下两种情况:
- 总能计算出寄一个解,但不一定保证解的正确性。
- 求解不一定成功;但只要成功,就能得到一个正确的。
对于前一种情况,人们主要关心解的正确概率是多少;对于后一种情况,人们主要关心求解成功的概率是多少,因此随机算法又被叫做概率算法。
设计的一般步骤
随机算法的一般步骤如下:
- 对给定问题设计的一个较为合适的确定性算法A;
- 分析算法那A的各个步骤以及每一步骤的有关操作,选取其中一些特定步骤或操作进行随机化,从而得到随机算法
AR
A
R
;
计算机无法产生绝对的随机数,计算机产生的随机数只是一定程度上是随机的,或称为伪随机数。随机数可以分成均匀随机数、正太随机数、Poisson随机数、Gamma随机数等,其中产生均匀随机数中最常用的方法称为线性同余法,生成一系列随机数 x0,x1,x2,...xn x 0 , x 1 , x 2 , . . . x n 。
{x0=dxk=(axk−1+c)modm { x 0 = d x k = ( a x k − 1 + c ) mod m其中,d称为随机序列的种子,m >0 称为模,a与c分别是乘数与增量,且满足 0⩽d<m,0⩽a<m,0⩽c<m 0 ⩽ d < m , 0 ⩽ a < m , 0 ⩽ c < m 。不同的取值影响到产生随机序列的性能,一般来说应该让 m m 尽可能的大,且让和 a a 的最大公约数为1,通常让为一个素数。
现代优化算法
禁忌搜索
禁忌搜索的含义
禁忌搜索(tabu search)算法是对邻域搜索的改进,其主要思想是避免搜索过程中多次回到同一点上,以便提高算法跳出局部最优解的能力。算法实现时,可以用一个禁忌表T来记录最近实施的搜索过程,并在接下来的若干搜索中禁止重复这些过程。
基本过程
- 找到问题的一个初始可行解 x0 x 0 ,令当前解 x=x0 x = x 0 ,禁忌表T为空。
- 如果终止条件满足,那么返回当前已找到的最优解,算法结束。
- 否则,在
x
x
的邻域中选取一个未被禁忌且评价最好的解
x′
x
′
,将从
x
x
到的搜索步
(x,x′)
(
x
,
x
′
)
更新到禁忌表T中,灵当前解
x=x′
x
=
x
′
并转到第二步。
在禁忌搜索中常常需要增加一个“特赦“法则,如果发现某个邻域解 x′ x ′ 比较理想,那么即使 x′ x ′ 被禁忌表禁忌,仍可以选取它作为新的当前解。
模拟退火算法
模拟退火算法的基本思想
模拟退火(simulating annealing)算法就是通过模拟物体的退火过程来进行寻优计算。它将问题的解模拟为物体的状态,解的目标函数值模拟为物体在此状态下的能量;在某一个温度下,搜索从一个状态随机的变化到另一个状态,到达每个状态的次数服从统计力学中的概率分布;当温度很低时,搜索过程讲义较大的概率停留在最优解。基本过程
- 找出问题的一个初始解 x0 x 0 ,令 x=x0,t=tmax x = x 0 , t = t m a x (初始最高温度)
- 如果终止条件满足,那么返回当前已找到的最优解,算法结束。
- 从当前解 x x 的邻域中随机选取一个解 x′ x ′ ,计算能量差 Δf=f(x)−f(x′) Δ f = f ( x ) − f ( x ′ ) ,如果 Δf Δ f 是负数或者一个很小的正数,则令 x=x′ x = x ′ 。
- 如果当前温度下的迭代次数超过上限,则转到第五步,否则转到第三步。
- 令 t=d(t) t = d ( t ) ,其中 d d 为温度变化函数,而后转到第三步。
遗传算法
基本思想
将问题的编解码为“染色体”,组成编码的元素成为“基因”,在泛迭代过程中,按照“适者生存”的规律,选取适应度高的染色体进行复制,并对他们进行杂交(crossover)和编译(mutation)操作,产生新一代更适应环境的染色体群。通过一代代不断的进化,直至产生出最适合环境的个体,并将其作为问题的最优解。
基本过程
- 生成问题的一组初始解,将其作为初始群体
- 如果终止条件满足,那么返回当前已找到的最优解,算法结束
- 计算群体中每个个体的适应度,选取其中适应度较高的一些个体作为种群
- 在种群个体之间进行杂交操作,得到新一代群体
- 在新群体中选取少量个体进行变异操作,而后转第2步。
对个体适应度进行评价的函数通常可取问题的目标函数,有时也可去其他相关的评价函数。
从群体中寻去种群时,应当以适应度作为标准,是的适应度越高的个体被选中的概率越大;但选取过程还应具有一定的随机性,是的适应度相差不大的个体都有被选中的可能,一种常见的选择方法叫做”轮盘赌“的方法。设群体的规模为N,其中每个个体的适应度为,那么个体
i
i
的选择概率如下:
蚁群算法
基本思想
蚁群算法是模拟自然界中蚁群的觅食行为的一种算法,在蚁群中,每只蚂蚁都会在经过的路径上分泌一定的信息素,经过的蚂蚁数量越多,路径上的信息素含量也就越高,而接下来的蚂蚁选择该路径的概率也就越大,这种蚁群搜索路径的过程是一种正反馈的过程。
在早期的蚁群算法中,信息素一旦分泌就不会减少,这不利于算法的收敛,在后续的改进中,原有的信息素会以一定的固定比例
α
α
挥发。
粒子群算法
基本思想
该算法模拟自然界中的飞鸟集群活动的规律,在状态空间中搜索计算问题的最优解。将例子看成状态空间飞行的、吾提及无质量的个体。每个粒子都根据自我经验以及想起他粒子的学习来调整飞行轨迹,从而改善搜索效率,促进整个群体向最优解收敛。
在n维解空间中,每个粒子i具有一个位置向量
xi=(xi1,xi2,...,xin)
x
i
=
(
x
i
1
,
x
i
2
,
.
.
.
,
x
i
n
)
和一个速度向量
vi=(vi1,vi2...vin)
v
i
=
(
v
i
1
,
v
i
2
.
.
.
v
i
n
)
,算法在搜索过程中记录下每个粒子i迄今为止搜索到的最优位置
p(best)
p
(
b
e
s
t
)
,以及整个粒子群起劲位置搜索到的最优位置
pbest
p
b
e
s
t
,二者分别称为局部最优解和全局最优解,在算法的每次迭代中,每个粒子都按照下面的公式更新速度和位置
N表示粒子数量,w表示惯性权重, c1 c 1 和 c2 c 2 表示学习因子, r1 r 1 和 r2 r 2 表示0~1之间的随机数。
基本过程
- 随机生成问题的一组初始解,对粒子群进行初始化
- 如果终止条件满足,那么返回当前已找到的最优解,算法结束
- 按照上面的公式计算每个粒子的速度和位置
- 更新每个粒子的局部最优解,并更新整个群的全局最优解,转到第3步。
在算法中,较高的 w w 值有利于粒子探索新的区域,而较低的有利于粒子趋向于汇集,那么科室的该值随着迭代次数的增加而现行下降。