在20世纪80年代后期,当研究人员开始研究如何通过面向对象原理推动软件复用的时候,围绕着领域的讨论开始变得流行起来。在复用的使用环境中,领域是应用程序具有共性的区域。每一个领域都有自己的词表,这个词表提供了描述领域的语言。这个语言帮助程序员设计适合特殊领域的系统和复用组件。领域专用语言(DSL)用来建立领域的模型,产生专有领域的软件,而不是手动地构建它。
算法,就像应用程序一样,也有领域一说。这个领域和专有应用领域是正交的。算法领域告诉我们应用领域是和特定算法有关的。例如,如果一名开发人员希望开发一个能够从移动电话上访问Web服务的应用程序,那么应该使用那些专为空间使用和额外存储优化的算法,而不是使用总体运行时间最快的算法。
算法领域并不像应用领域那样良好地被定义,算法领域更加的泛化,并且扩展了一些应用领域。算法领域和计算机科学领域更加的紧密。例如,我们可以看到,查找和图遍历算法而不是数值算法在人工智能领域中被频繁地使用。数据库管理系统有着它们自己的算法,这些算法比在其他的应用领域中使用得都要频繁。
在我们的算法模式中,我们并不指明一个算法适用的领域,因为没有一个标准的对照表存在。但是,每一个算法出现的使用环境给读者指明了这个算法适用的特定领域。当一个人对算法越来越熟悉,以及开始考虑算法模式方面的事情时,一个能够良好映射应用领域和算法领域的分类就显得尤为重要。
开发一个算法领域和应用领域的映射关系是一个非常有趣和重要的研究领域。一个适当的分类能够帮助我们开发和生产更好的软件组件和应用。研究人员将高级数学分析应用到了分类研究中(Algorithm Formalization,2007)。
从一个从业者的观点来看,算法的分类通常情况下是决定于自己的经验或者经历过的一些印象特别深刻的情境(Skiena,1998)。在使用特定类型的算法时,这些情境给予了软件开发人员更敏锐的直觉和自信。文献,包括学术和工业的文献,充满了关于算法的这些令人印象深刻的故事,我们鼓励你得到自己的这些故事。这样一种锻炼能够帮助你更好地研究算法,并且成为一名更好的软件开发者。算法之美是在于算法领域和适用性是在不断扩展的。新的算法不断地开发出来,但更重要的是,更多使用现存算法的新应用不断被发现。思考算法领域将能够帮助你更好地掌控这种一直非常复杂的关系。