第1章引论
在这一章,我们阐述本书的目的和目标并简要复习离散数学以及程序设计的一些概念。我们将要
看到程序对于合理的大量输入的运行性能与其在适量输入下运行性能的同等重要性。
概括为本书其余部分所需要的基本的数学基础。
简要复习递归。
概括用于本书的Java语言的某些重要特点。
1.1本书讨论的内容
设有一组N个数而要确定其中第k个*大者。我们称之为选择问题(selectionproblem)。大多数学习过一两门程序设计课程的学生写一个解决这种问题的程序不会有什么困难。“明显的”解决方法是相当多的。
该问题的一种解法就是将这N个数读进一个数组中,再通过某种简单的算法,比如冒泡排序法,以递减顺序将数组排序,然后返回位置k上的元素。
稍微好一点的算法可以先把前k个元素读人数组并(以递减的顺序)对其排序。接着,将剩下的元素再逐个读入。当新元素被读到时,如果它小于数组中的第k个元素则忽略之,否则就将其放到数组中正确的位置上,同时将数组中的一个元素挤出数组。当算法终止时,位于第k个位置上的元素作为答案返回。
这两种算法编码都很简单,建议读者试一试。此时我们自然要问:哪个算法更好?哪个算法更重要?还是两个算法都足够好?使用一千万个元素的随机文件和k=5000000进行模拟将发现,两个算法在合理的时间量内均不能结束;每种算法都需要计算机处理若干天才能算完(虽然*后还是给出了正确的答案)。在第7章将讨论另一种算法,该算法将在一秒钟左右给出问题的解。因此,虽然我们提出的两个算法都能算出结果,但是它们不能被认为是好的算法,因为对于第三种算法能够在合理的时间内处理的输入数据量而言,这两种算法是完全不切实际的。
第二个问题是解决一个流行的字谜。输人是由一些字母构成的一个二维数组以及一组单词组成。目标是要找出字谜中的单词,这些单词可能是水平、垂直或沿对角线上任何方向放置的。 计算机功能的增强、 速度的提高和应用的普及, 增长了人们对实用算法分析和**编程实现的需求。在Java语言广泛使用的今天, 希望我们这样一本兼顾普及和提高的数据结构与算法分析教材能够对广大读者有所裨益。
本书为《Data Structures and Algorithm Analysis in Java》第2版的中译本。这里, 原著者Mark Allen Weiss对第1版进行了全面的修订, 将书中的算法、 技巧与精心编制的**Java程序有机地结合起来, 通过图示和实例清楚地阐释对每种算法缜密、 严格和深入的分析。
应该指出, 书中改进*大的方面是用Java 5.0对内容所作的全面更新, 尤其是各章的程序。当然, 以介绍Java基础为重要内容的第1章发生显著变化则是必然的。再有, 第3章对表、 栈、 队列的讨论已被全面修订。第4章也有些相应的变化, 包括对TreeSet类和TreeMap类的讨论。其他各章或多或少都有些相关的更新。众所周知, Java 5.0是Java自发布以来到目前为止改动*大的版本, 其强大的新特性和新功能使Java性能产生了巨大的飞跃。
因此, 本书经过Java 5.0的全面改进, 其意义是显而易见的。此外, 对前1版中发现的错误, 这次第2版均已得到纠正。至于有关第2版更多的信息, 读者可从因特网特别是前言中提到的作者Weiss的网站上查到。
在本书翻译过程中, 王永柿老师阅读了初稿的大部分章节并提出宝贵的意见和建议, 马蒙蒙老师仔细比较并标注了原著第1版和第2版之间的差别, 译者衷心感谢他们对翻译工作真诚的帮助。此外, 译者特别要感谢广大读者对第1版的深切关爱, 并企盼着对本书(第2版)进一步的批评和指正。