问题的输入是一列整数对,其中每个整数都表示一个某种类型的对象,一对整数p q可以被理解为“p和q是相连的”。我们假设“相连”是一种等价关系,这也就意味着它具有:
自反性:p和p是相连的;
对称性:如果p和q是相连的,那么q和p也是相连的;
传递性:如果p和q是相连的且q和r是相连的,那么p和r也是相连的
研究这个问题的应用场景
网络
输入中的整数表示的可能是一个大型计算机网络中的计算机,而整数对则表示网络中的连接。这个程序能够判定我们是否需要在p和q之间架设一条新的连接才能进行通信,或是我们可以通过已有的连接在两者之间建立通信线路;或者这些整数表示的可能是电子电路中的触点,而整数对表示的是连接触点之间的电路;或者这些整数表示的可能是社交网络中的人,而整数对表示的是朋友关系。在此类应用中,我们可能需要处理数百万的对象和数十亿的连接。
变量名等价性
某些编程环境允许声明两个等价的变量名(指向同一个对象的多个引用)。在一系列这样的声明之后,系统需要能够判别两个给定的变量名是否等价。这种较早出现的应用(如FORTRAN语言)推动了我们即将讨论的算法的发展。
数学集合
在更高的抽象层次上,可以将输入的所有整数看做属于不同的数学集合。在处理一个整数对p q时,我们是在判断它们是否属于相同的集合。如果不是,我们会将p所属的集合和q所属的集合归并到同一个集合。
研究算法的一般步骤
- 完整而详细的定义问题,找出问题所必需的基本抽象操作并定义一份API
- 简洁地实现一种初级算法,给出一个精心组织的开发用例,并使用实际数据作为输入
- 当实现所能解决的问题的最大规模达不到期望时决定改进还是放弃
- 逐步改进实现,通过经验性分析或(和)数学分析验证改进后的效果
- 用更高层次的抽象表示数据结构或算法来设计更高级的改进版本
- 如果可能尽量为最坏的情况下的性能提供保证,但在处理普通数据时也要有良好的性能
- 在适当的时候将更细致的深入研究留给有经验的研究者,并继续研究下一个问题
研究算法的价值
- 优秀的算法因为能够解决实际问题而变得更为重要
- 高效算法的代码也可以很简单
- 理解某个实现的性能特点是一项有趣而令人满足的挑战
- 在解决同一个问题的多种算法之间进行选择时,科学方法是一种重要的工具
- 迭代式改进能够让算法的效率越来越高