算法笔记(I) 分类

首先,我们打开任何一本算法书,来看看一本算法书是怎样展开的,这样的书很常见,我眼下就有一本:《算法基础》(Gilles Brassard * Pau Bratley),很抱歉,我的英文很差,这是一本译本。我们来一起总结一下一本合格的算法书该怎样写?

1. 按常理,作者在第一部分应该做一个预备知识,其实主要是离散数学的一些东西,如基础逻辑、集合论、渐进式等,如果作者有兴趣,可以写一写计算机科学的基础:《计算理论》的知识,如可解与不可解、NPC理论等等(事实上多数算法书把这些内容后置了,如本书以及算法导论等等)。这本书的第一部分有以下几个内容,也验证我的说法:

首先,作者介绍什么叫算法,也就是,主题:这本书要讲什么?我心中冒出的答案是:算法就是一段根据确定输入可以得到确定输出的程序,但它是错的。观察书和网上百科给出的定义,“算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出(百度百科)”。这并不是很严谨规范的定义,还需要给出一定的限制,于是高德纳给出以下的限制:

输出(没输出对我们没意义)、输入(也可以为空的输入)、明确性(计算机世界没有人类的直觉和灵感,你必须给他明确的指令)、有限时间或步骤(无限时间对我们来说也是无效的)、有限性(意味着计算机只能解决离散有穷域问题,这也是数学上经典的思想,将连续域转成离散有穷的表示,进而用计算机求解)。于是,通过引入了《离散数学》和《计算理论》的知识,算法的定义似乎严谨了很多。

我这么说是啰嗦了,但是这是我们的首要问题,必须搞清楚它。我们继续看:书的第一部分还应该说什么:一堆符号说明,关于基本的离散数学知识。不过正如我说的,算法书仍离不开对《计算理论》的阐述,它介绍了计算机学科三大证明方法:

构造,反证,归纳。如此这三种证明方法贯穿计算机领域。然后,算法书必然涉及对算法分析方法的介绍,也就是渐进式、极限、概率等等。那么这就是一个很全面的预备知识。

2. 我们已经进入书的主体了。尽管这本书有其独特的特点,但是,我就此不按这本书的结构去分析,大家借鉴一下此书的其章节的设置:

预备知识(我们已经介绍了),基本算法,渐近记法,算法分析,一些数据结构,贪婪算法,分治算法,动态规划,搜索图(如深度优先,广度优先),概率算法,并行算法,计算复杂性,启发式与近似算法(全书完)

从我的认识出发,这是一本很好的教科书,内容全面,结构合理,循序渐进,不过我们打乱步骤,来分析却有另一番见解:在上过或者看过《离散数学》《计算理论》《集合论》《图论》(尽管后两者都是离散数学的分支)后,我们试图从书的结构中看出端倪:

我们的第一个结论就是:算法设计的三大基本思想无非是:贪心、分治、动态规划[说法有误,见补充]。我们从各种基本的算法中都可以看出他们展现的强大能力,

如贪心法在最小生成树算法,他的原理在于当前最优解是为最终最优解的子集。

分治在快速排序算法中,他的原理在于将大而难的问题转成小的子问题,通过以简单的规则解决小问题并将其结果组合成大问题的解而完成求解。

动态规划在最短路径算法中,他的原理在于将求解过程中各个子问题的求解结果记录下来,尽管多了存储空间,但是时间上避免了重复求解相同的子问题,本质上它是一种以空间换时间的技术。

我们的第二个结论就是,对于图,这种计算机世界的核心模型,他本质上描述了对象及其对象的关系。他可以建立在空间上,如城市网,也可以建立在时间上,如工件的加工流程。我个人认为他与连续域的微分方程在各自领域起到同等的作用。

我们的第三个结论是,对图的访问抑或搜索,主要分作两种方案,这个也和我们的直觉相符:深度优先、广度优先。他们在各种搜索方案中均有应用,例如最短路径算法中采用的是广度优先方案,在但是相较而言,利用深度优先可以对图的结构(连通性)进行分析,所以功能更为强大,应用也更广,如生成图的拓扑排序表等。

现在,我们的结论已经有三了,我们近一步分析算法的内容,如何对算法进行分类:(这也是我们的结论)

我想无非从以下几个出发点去理解:

1)有无先验知识(对于确定算法,体现在是否对问题的特性进行分析。对于启发式方法,往往体现在是否事先对问题的特性进行假设)

2)确定抑或随机(也就是说,在算法规则中有无概率因素,当然这会导致结果的不同,这就体现了,为什么我说算法给出确定的输出是错误的描述):如书中所言,随机不意味随意,要建立在每个值的概率是已知并可控制的。说的透彻点,随机是建立在一定的概率模型上的。

对于一个算法,他的设计如若建立在对问题的假设上,则强烈依赖于问题的性质,这个在逻辑上是很好理解的。如果他的假设是成立的,这个算法对此问题将展现优异的效果;反之,如果假设不成立,则算法就会低效,甚至是错误的。这就是一个基本的原理。

如此,我们知道穷举法就是一种不利用问题特性的方法,他不依赖问题的特性,效率低,但是他确定会搜到解(或者说是最优解),而对于概率算法,其不能保证搜到最优解,但是在概率的意义上,他会。如果我们在加入问题的特性,也就是我们对这个问题有了认识时或者假设时,算法的效率会大大增强。

反思,我们的各种优美的算法,其中必然显性抑或隐性的利用这个原理。因为,如果不利用问题的结构抑或性质,我们的算法不就沦为穷举抑或随机搜索了么?这也是一个反证的例子。

现在,我们基本上将《算法基础》的主要结构都简要阐述了一下(当然除了并行算法一章),我们总结一下本文:

 

首先,我借对算法教科书的理解,来阐述对算法的理解,主要分作 预备知识(这涉及到计算机学科的基本)

算法设计思想(三种基本思想贯穿算法的设计),算法的分类(其中隐含了算法设计的基本原理,即先验知识与假设)。

 

 

修订:

最近在重读《数据结构》,发现很多知识点以前没有注意到,特别关于分类问题,我又有了新的认知。所以利用此次机会补充上文对算法的分类。上文说了算法的设计思想主要可以分成:贪心、分治、动态规划;不过这个认知只是我的单方面理解,在ohio state university的数据结构课程讲义上,有另外一种更为清晰的分法:

General Algorithms  通用算法

  Brute Force Algorithms 暴力搜索
   .1 Sequential Search 循序搜索
   .2 Hamilton Circuits  哈密顿回路问题


 Greedy Algorithms 贪婪算法
   .1 Prim’s Minimal Spanning Tree Algorithm 最小生成树:prim算法
   .2 Kruskal’s Minimal Spanning Tree Algorithm 最小生成树: kruskal算法
   .3 Dijkstra’s Single-Source Shortest Paths Algorithm 单源最短路径: Dijkstra算法
   .4 Coin Change 找零钱问题
   .5 Egyptian Fractions 分数分解问题
   .6 Map Coloring 地图着色问题

   .7 Voting Districts 选区划分问题(似乎美国数模竞赛有这个题)
   .8 Vertex Cover 图的凸覆盖问题
   .9 0/1 Knapsack 背包问题
 Divide-and-Conquer Algorithms 分治法
   .1 Merge Sort 归并排序
   .2 Quick Sort 快速排序
   .3 Tiling with L-Grouped Tiles 铺瓷砖(刘汝佳在黑书中讲解过,话说黑书的一部分结构和Ohio的讲义结构好像)
   .4 Closest Pair 最近点对
   .5 Strassen’s Matrix Multiplication 矩阵乘法

 

State Search Algorithms 状态空间搜索


 Backtracking Algorithms 回溯算法
   .1 Solution Spaces 解空间
   .2 Traveling Salesperson 旅行商问题TSP
   .3 The Queens Problem 八皇后问题
   .4 Convex Hull (Graham’s Scan) 凸包算法
   .5 Generating Permutations 字符串的扰动顺序问题

 Branch-and-Bound Algorithms 分支定界算法
   .1 Cost-Based Tree Traversal 有偿的树遍历问题
   .2 Mazes 迷宫问题
   .3 Traveling Salesperson Problem 旅行商问题
   .4 Job Scheduling 调度问题
   .5 Integer Linear Programming 整数线性规划
 Dynamic Programming Algorithms 动态规划
   .1 Fibonnaci Numbers 斐波那契数列
   .2 0/1 Knapsack Problem 背包问题
   .3 All Pairs Shortest Paths (Floyd-Warshall) 全源最短路径算法:弗洛依德算法

                                                                    ”

即将算法的设计思想分为:通用的算法设计以及状态空间搜索两大类;

1. 对于通用算法分为暴力搜索、贪婪以及分而治之;

2. 对于状态空间搜索分为回溯、分支定界以及最为技巧性的动态规划。

上面的例子非常的详细,有些看似简单的算法都蕴含着丰富的内涵,这里就不赘述了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值