第一章

1.“学习算法设计的主要原因是,设计原理赋予我们节省巨大开销的潜力,甚至让我们完成那些原本不可能完成的任务。”

重要的是学习how,而不仅仅是what。

 

2.在寻找一个能完成特定任务的程序时,可能还需要解决许多相关的问题。

这些相关的问题可能会带来很多益处,比如《Getting Real》,“研究宇宙学有什么意义吗”( http://www.zhihu.com/question/20252067/answer/16019199?utm_source=weibo&utm_medium=weibo_share&utm_content=share_answer&utm_campaign=share_button )。

 

3.开发算法的首要任务之一是:确保以一种合理的方式定义问题。

开发的过程中因为对问题的认识逐步深入,常常需要重新定义、改进问题(也许会有迭代的规律?)。

 

4.以连通性问题为例——问题的“定义”,是为了让我们对问题有更多理解、对问题提供更多的信息,而不只是原来的那些简单信息。

连通性问题的原本问题信息,可能被“高级推理”为这样的问题:M个连接足以让N个对象联通吗?这样的问题的答案为“是”或“不是”。然后联系到图论得出的基本结果表明,当且仅当连通性问题输出的对数正好等于N-1时,所有的N个对象全部连通(换句话说,一旦输出了N-1个对后,所有的对象都已经被连接)。

 

5.尽力将解决问题过程中遇到的基本算法作为副产品开发出来,是有好处的,这些算法也可能适用于其他问题。一般而言,开发更强大的抽象层是计算机科学的基本过程,在算法设计上尤其如此。

 

6.“算法”和“基本算法”。

算法,是适用于计算机的,用以解决问题的被设计出来的方法。算法是针对于问题的,而不只是各种查找算法、排序算法。在解决问题的过程中,有一些部分是被很多问题都需要的过程,这些问题是“基本算法”,比如常用的就是查找算法、排序算法。

 

7.解决问题的过程可能是这样(以连通性问题为例):

1)我们需要解决连通性问题;

2)我们想到解决的方法是对每一个输入对,在已有的连通集合(已连通分量,connected component)查找,若找到则继续下次输入,否则将本次输入对并入已有的连通集合;

3)进行下次查找。

在这个过程中,我们需要能查找某一个对是否已连通,我们需要一个查找算法;然后我们还需要一个并入算法,将这个未连通的对标记为已连通。根据这两种算法可能的实现,我们可能需要某种方式记录已连通的对,选择或开发一种新的数据结构作为这些对的集合。对于连通性问题,存储大量记录的全部不太可能,而且即便存储了全部,也没有简便方法立即判断输入对是否已连通。书中选择了一种简单方法,使用一个整数数组。

posted @ 2013-01-28 00:15  debug_me_  阅读(140)  评论(0)    收藏  举报