您的位置:首页 > 其它

贪心算法解决基站问题

2016-05-24 10:44 281 查看


18.4 历年例题分析(例题16)

2009-03-12 08:49 王勇/唐强 电子工业出版社 字号:T | T



《软件设计师考试考点分析与真题详解:最新版》第18章数据流图设计,本章的试题内容涉及到流程图设计、软件界面设计、数据库设计和软件测试等多个方面,要求考生熟练地掌握软件分析和软件设计的常用方法和技术。本节为大家介绍历年例题分析(例题16)。

AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验

18.4  历年例题分析(例题16)

例题16(2007年5月试题4)

阅读以下说明和图,填补流程图中的空缺,将解答填入答题纸的对应栏内。

【说明】

在一条农村公路的一边稀疏地分布着房子,其分布如图18-42 所示。某电信公司需要在某些位置放置蜂窝电话基站,由于基站的覆盖范围是6公里,因此必须使得每栋房子到某个基站的直线距离不超过6公里。为简化问题,假设所有房子在同一直线上,并且基站沿该直线放置。现采用贪心策略实现用尽可能少的基站覆盖所有的房子。


 
(点击查看大图)图18-42
实现贪心算法的流程如图18-43所示,请填充其中空白并计算该算法的时间复杂度,其中:

1.d[i](1≤i≤N)表示第i个房子到公路A端的距离,N表示房子的总数,房子的编号按照房子到公路A端的距离从小到大进行编号。

2.s[k]表示第k(k≥1)个基站到公路A端的距离,算法结束后k的值为基站的总数。


 
(点击查看大图)图18-43
该算法的时间复杂度为 (5) 。

例题16分析

本题是一个程序流程图题,题目以贪心算法来解决一个实际问题。在对程序流程图进行分析之前,我们必须把程序要解决的问题及解决方案搞清楚。为了达到这个目的,不妨手动来尝试解决此问题。

假设实际的房子分布情况如图18-44所示。



 
(点击查看大图)图18-44
那么第一个基站应该建在何处呢?

是不是建立在6米的位置,让其覆盖第1个房子?不是,因为第1个房子在5米的位置,若将基站建在6米的位置,0~5米之间的信号覆盖将被浪费,所以应将基站1建立在11(5+6)米处,这样正好能覆盖到第1个房子。再看第2个房子,该房子在15米处,由于基站1建立在11米处,能覆盖5~17米范围,所以能被基站1覆盖,无须新建基站。接下来看第3个房子,该房子在25米处,超出了基站1的覆盖范围,所以需要新建基站,该基站的建设位置应是31(25+6)米处。建设好的基站1与基站2的情况如图18-45所示。



 
(点击查看大图)图18-45
当型清楚原理以后,再来解题就比较容易了。先看第(1)空,从整个程序结构来看,该处属于初始化部分,由于后面的程序要用到k,但未给k初值,所以在此是对k赋初值的操作。k是表示基站的编号,该编号在程序的处理过程中会根据需要递增。而初值为0还是1取决于程序是在对基站相关数据处理之前对k做自增运算,还是在之后做自增。因此需要进一步分析程序结构才能得出结论。继续看程序的"i<=N",这句很好理解,当所有房子遍历完以后,程序结束。第(2)空所在的判断用于判别当前的房子,是否能被当前的基站覆盖,若能,则判断下一个房子是否也在信号覆盖之内;若不能,则新建一个基站。但房子的最大编号为N,超出N代表遍历完成,所以(2)应填:j
<= N。该条件判断的假分支用于新建一个基站。之前分析了在k的初值取决于k自增的位置,从此处我们就可以看出,k是在第(3)空完成的自增,而第(4)空位置是对新基站进行操作。所以(3)填k = k+1,(1)填k = 0。第(4)空的操作是确定新基础的位置,即从上一个基站无法覆盖的d[i]房子起的第6米设基站,所以该空填:d[i] + 6。最后是求算法的时间复杂度,虽然算法中包含两个循环,但我们可以注意到这两个循环并非嵌套,并且只对所有房子遍历了一次,所以算法复杂度是O(N)。

例题16参考答案

(1)k = 0

(2)j <= N ,或其等价形式

(3)k = k+1,或其等价形式

(4)d[i] + 6,或其等价形式

(5)O(N),O(n) 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: