目录
时代背景:
随着速度的不断提高和存储容量的持续增长,计算机的功能日益强大,从而处理数据和解决问题的规模和复杂程度与日俱增。
这不仅带来了需要认真研究的新课题,而且突出了原有数据结构和算法效率低下的缺点。
程序的效率问题不是由于计算机功能的强大而受到冷落,相反地,倒是被人们提到前所未有的重视程度,因为大型问题的解决所涉及到的大容量存储和高速度运算容不得我们对效率有丝毫的忽视。
本书讨论的内容:
设有一组N个数而要确定其中第k个最大者,我们称之为选择问题(selection problem)。
大多数学习过一两门程序设计课程的学生写一个解决这种问题的程序不会有什么困难。解决方法是相当多的。
该问题的一种解法就是将这N个数读进一个数组中,再通过某种简单的算法,比如冒泡排序法,以递减顺序将数组排序,然后返回位置k上的元素。
------
稍微好一点的算法可以先把前k个元素读入数组并(以递减的顺序)对其排序。接着,将剩下的元素再逐个读入。当新元素被读到时,如果它小于数组中的第k个元素则忽略之,否则就将其放到数组中正确的位置上,同时将数组中的一个元素挤出数组。当算法终止时,位于第k个位置上的元素作为答案返回。
此时我们自然要问:哪个算法更好?哪个算法更重要?还是两个算法都足够好?使用三千万个元素的随机文件和k=15000000进行模拟将发现,两个算法在合理的时间量内均不能结束;每种算法都需要计算机处理若干天才能算完(虽然最后还是给出了正确的答案)。
在第7章将讨论另一种算法,该算法将在一秒钟左右给出问题的解。因此,虽然我们提出的两个算法都能算出结果,但是它们不能被认为是好的算法,因为对于第三种算法能够在合理的时间内处理的输入数据量而言,这两种算法是完全不切实际的。
------
本书讨论数据结构和算法分析。数据结构主要研究组织大量数据的方法,而算法分析则是对算法运行时间的评估。
随着计算机的速度越来越快,对于能够处理大量输入数据的程序的需求变得日益急切。
可是,由于在输人量很大的时候,程序的低效率现象变得非常明显,因此这又要求对效率问题给予更仔细的关注。
通过在实际编程之前对算法的分析,学生可以决定一个特定的解法是否可行。
例如,学生在本书中将读到一些特定的问题并看到精心的实现方法是如何把对大量数据的时间限制从16年减至不到1秒的。
因此,若无运行时间的阐释,就不会有算法和数据结构的提出。在某些情况下,对于影响算法实现的运行时间的一些微小细节都需要认真地探究。
一旦解法被确定,程序还是必须要编写的。随着计算机的日益强大,它们必须解决的问题就变得更加巨大和复杂,这就要求开发更加复杂的程序。
本书的目的是同时教授学生良好的程序设计技巧和算法分析能力,使得他们能够开发这样的具有最高效率的程序。
------
在许多问题当中,一个重要的观念是:写出一个可以工作的程序并不够。如果这个程序在巨大的数据集上运行,那么运行时间就变成了重要的问题。
我们将在本书中看到对于大量的输入,如何估计程序的运行时间,尤其是如何在尚未具体编码的情况下比较两个程序的运行时间。
我们还将看到彻底改进程序速度以及确定程序瓶颈的方法。这些方法将使我们能够找到需要大力优化的那些代码段。
递归简论:
当编写递归例程的时候,关键是要牢记递归的四条基本法则:
1.基准情形。必须总有某些基准情形,它无须递归就能解出。
2.不断推进。对于那些需要递归求解的情形,每一次递归调用都必须要使求解状况朝接近基准情形的方向推进。
3.设计法则。假设所有的递归调用都能运行。
4.合成效益法则(compound interest rule)。在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。