书籍封面
第2章 数组
问题
1.
向一个无序数组中插入一个数据项:D
A.
费时与数组的大小成正比。
B.
需要多次比较。
C.
需要移动其他数据项来提供空间。
D.
不管已有多少数据项都花费同样的时间。
解:无序数组的插入是我们到现在为止(本章范围内)所见过的算法中惟一一个与数组中的数据项个数无关的算法。新数据项总是被放在下一个有空的地方,无论数组中的数据项个数N有多大,一次插入总是用相同的时间。
2.
判断题:当从无序数组中删除数据项时,大多数情况下需要移动其他数据项来填洞。
真
解:有序数组和无序数组中的删除操作都很慢,这是因为数据项必须向前移动来填补已删除数据项的洞。
3.
在无序数组中,允许重复会导致:B
A.
所有操作时间都会增加。
B.
在某些情况下查找时间的增加。
C.
总会增加插入时间。
D.
有时会减少插入时间。
解:允许重复将会使查找算法复杂化:即使匹配上了一个,它还得继续寻找可能的匹配,直到最后一个数据项。
4.
判断题:当从无序数组中,查找一个不在数组中的数据项通常要比找到一个数据项快。
假
解:无序数组中数组项的查找到现在为止(本章范围内),在查找过程中,一个一个地与数组中的数据项比较(线性查找),如果循环到最后一个数据项,但是仍旧没有匹配上,才知道这个值不在数组中。
5.Java
中创建一个数组需要使用关键字:new
解:Java中把数组当作对像来对待,因此在创建数组时必须使用new操作符。
6.
如果类A要使用类B,那么:
D
A.
类A中的方法应该很好理解。
B.
如果类B与程序用户交互是更加可取的。
C.
比较复杂操作都放在类A中。
D.
类B能做的操作越多越好。
解:如果一个类被许多程序员使用,那么这个类必须设计得容易使用才行。类的用户通过类接口方式与类相连。由于类的字段经常是私有的,所以当我们讨论接口时,经常是指类的方法,它们是用来干什么的和它们的参数是什么。通过调用这些方法,类用户与类对象进行交互。面向对象编程最重要的优点之一是类的接口可以设计得尽可能方便且高效。
7.
当类A使用类B时,可以被类A访问的类B中的方法和字段被称作是类B的:接口
8.
与无序数组相比,有序数组:D
A.
删除更快。
B.
插入更快。
C.
创建更快。
D.
查找更快。
解:使用有序数组会给我们带来什么好处?最主要的好处是查找速度比无序数组快多了。不好方面是在插入操作中由于所有靠后的数据都需移动以腾开空间,所以速度较慢。有序数组和无序数组中的删除操作都很慢,这是因为数据项必须向前移动来填补已删除数据项的洞。
9.
对数是指数的反函数。
解:某数的指数函数的反函数被称作对数。
10.
以10为底1000的对数是:log10(1000)=3
11.
在一个含有200个数据项的数组中完成二分查找所需检查的最大数据项个数是:B
A.200
。
B.8
。
C.1
。
D.13
。
解:
步数
|
可能值的范围
|
0
|
1-200
|
1
|
1-100
|
2
|
1-50
|
3
|
1-25
|
4
|
1-12
|
5
|
1-6
|
6
|
1-3
|
7
|
1-1
|
8
|
1
|
12.
以2为底64的对数是:log2(64)=6
13.
判断题:以2为底100的对数是2。
假
14.
大O表示法表示了:A
A.
算法的速度是如何与数据项的个数相关的。
B.
含有给定大小的数据结构的算法的运行时间。
C.
含有给定数据项数目的算法的运行时间。
D.
数据结构的大小是如何与数据项的个数相关的。
解:大O表示法的实质并不是对运行时间给出实际值,而是表达了运行时间是如何受数据项个数所影响的。
15.O(1)
意味着一个操作执行了
常量
的时间。
16.
简单类型变量和
对象
变量都可以存入数组中。
编程作业
编程作业有助于巩固对本章内容的理解,并展示如何应用本章的概念。
2
.1 向highArray.java程序(清单2.3)的HighArray类添加一个名为getMax()的方法,它返回数组中最大关键字的值,当数组为空时返回-1。向main()中添加一些代码来使用这个方法。可以假设所有关键字都是正数。
2.2
修改编程作业2.1中的方法,使之不仅返回最大的关键字,而且还将该关键字从数组中删除。将这个方法命名为removeMax()。
2.3
编程作业2.2中的removeMax()方法提供了一种通过关键字值进行数组排序的方法。实现一个排序方案,要求不修改HighArray类,只需对main()中的代码进行修改。这个方法需要第二个数组,在排序结束时数组数据项是逆序排列的。(这个方法是第3章“简单排序”中选择排序的一个变体。)
2.4
修改orderedArray.java程序(清单2.4)使insert()、delete()与find()方法一样都使用二分查找,正如书中所建议的那样。
2.5
向orderedArray.java程序(清单2.4)的OrdArray类加入一个merge()方法,使之可以将两个有序的源数组合并成一个有序的目的数组。在main()中添加代码,向两个源数组中插入随机数,调用merge()方法,并将结果目的数组显示出来。两个源数组的数据项个数可能不同。在算法中需要先比较源数组中的关键字,从中选出最小的一个数据项复制到目的数组。同时还要考虑如何解决当一个源数组的数据项已经取完而另一个还剩一些数据项情况。
2.6
向highArray.java程序(清单2.3)的HighArray类中加入一个noDup()方法,使之可以将数组中的所有重复数据项删除。即如果数组中有三个数据项的关键字为17,noDup()方法会删除其中的两个。不必考虑保持数据项的顺序。一种方法是先用每一个数据项同其他数据项比较,并用null(或是一个不会用在真正的关键字中的特殊值)将重复的数据项覆盖掉。然后将所有的null删除,当然还要缩小数组的大小。