这一章会讨论本书的主旨和目标,简短回顾下编程相关概念和离散数学。
我们将会
- 理解一个程序在大规模输入时的性能跟中等输入规模是的性能是同等重要的。
- 汇总下本书剩余部分所需的数学背景知识。
- 简单回顾下递归这一概念。
- 总结整本书使用的Java语言的若干个重要的特征。
1.1节 本书会讲什么呢内容?
本书中会看到
- 如何估计一个有大量量输入的程序的运行时间?
- 如何不用编码就能比较两个程序的运行时间?
- 有哪些可显著提升程序速度和判断性能瓶颈的技术?(这些技术可帮助我们定位到值得花费精力进行优化的代码)
在许多问题里,写一个能运行的程序是不够好的。如果程序要运行在大数据集上,则该程序的运行时间就可能成为问题。
下面以选择问题和单词拼图问题为例进行说明。
选择问题
假设有N个数,想找出第k大的数。
算法一
先对将这N个数读入一个数组,然后对这个数组按照从大到小排序,最后返回排好序的数组的第k个元素即可。
算法二
先将前k个数读入一个数组,并按照由大到小的顺序排好序;
接着,一个接一个读取剩下的数。每次遇到一个新的数,如果该新数比数组的第k个元素还小,则什么都不做;否则,就在数组中找一个合适的位置插入该新数,同时从数组中删除一个元素;
当算法结束时,返回数组的第k个元素即可。
问题1 哪个算法更好?
问题2 两个算法是足够好?
答:不是足够的好,因为已知存在一组随机生成的3000万个数当k取1500万时,两个算法都不能在合理的时间内完成,都需要计算机算几天的时间。
问题3 是否存在能在合理时间内完成大数据量的该选择问题的算法?
答:存在。在本书第7章中,会给出一种算法,可在1秒钟内给出结果。
单词拼图问题
给定一张单词拼图,一个两维数组字符,和一个单词列表。拼图里单词的方向可能在水平方向上,也可能在垂直方向上,也可能在任务对角线方向上。请判断单词列表里的每个单词是否在该拼图中?