算法效率分析与分治法的应用学习课件.pptVIP

  • 100
  • 0
  • 约8.1千字
  • 约 53页
  • 2016-12-06 发布于江苏
  • 举报

算法效率分析与分治法的应用学习课件.ppt

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 结论及其证明 结论1: 以连通分量中的任一点p作为根结点的二叉树,必然能够包含连通分量中的所有顶点。 结论2: 包含m个结点的二叉树Tm,只需要船的数量为boat[m]=[m/2](m?N)。 如何证明? 采用数学归纳法(见文本“论文”) 如何输出具体的乘船方案 proc try(father:integer;var root:integer;var rest:byte); {输出root为树根的子树的乘船方案, father=0表示root是其父亲的左儿子, father=1表示root是其父亲的右儿子, rest表示输出子树的乘船方案后,是否还剩下一个根结点未乘船} begin visit[root]:=true; {标记root已访问} 找到一个与root同姓且未访问的结点j; if jn+1 then try(0,j,lrest); 找到一个与root同姓且未访问的结点k; if kn+1 then try(1,k,rrest); if (lrest=1) xor (rrest=1) then begin {判断root是否只有一个儿子,情况一} if lrest=1 then print(lrest,root) else print(rrest,root); rest:=0; end else if (lrest=1) and (rrest=1) then begin {判断root是否有两个儿子} if father=0 then begin print(rrest,root);root:=j; {情况二} end else begin print(lrest,root);root:=k; {情况三} End; rest:=1; end else rest:=1; end; ? 这只是输出一棵二叉树的乘船方案的算法,要输出所有人的乘船方案,我们还需再加一层循环,用于寻找各棵二叉树的根结点,但由于每个点都只会访问一次,寻找其左右儿子各需进行一次循环,所以算法的时间复杂度为O(n2)。 分治思想 分治(divide-and-conquer)就是“分而治之”的意思,其实质就是将原问题分成n个规模较小而结构与原问题相似的子问题;然后递归地解这些子问题,最后合并其结果就得到原问题的解。其三个步骤如下; 分解(Divide):将原问题分成一系列子问题。 解决(Conquer):递归地解各子问题。若子问题足够小,则可直接求解。 合并(combine);将子问题的结果合并成原问题的解。 例题分析1 0-1序列 考虑这样一个序列”110100100010000……”就是”1” + ”10”+”100”+”1000”+……要求求出第I位是0 还是1。 Input: 第一行:N,测试点的个数;(N 10000) 第二行:N个数(0); Output: 对每个测试点输出0 或 1,每行一个数; Sample Input: (bit.in) 3 1 2 3 Sample Output: (bit.out) 1 1 0 电缆老板(MASTER) ? 某地区即将举行区域程序设计比赛,竞赛委员会已经成立并决定举行一次最公平的竞赛,他们决定利用星形拓扑结构来连接每个竞赛者的电脑---也即连接这些电脑到一个中心HUB上;为了达到真正的公平竞赛目的,竞赛委员会主任下令要求:每个竞赛电脑连接到中心HUB的电缆必须是一样长的。 竞赛委员会联系了一个本地的电缆老板,要求老板为他们提供一定量的相同长度的电缆,而且要求电缆长度越长越好。通过调查,电缆老板知道仓库中每根电缆的长度(精确到厘米),而且他可以以厘米的精度剪断电缆,但确不知道他能为竞赛委员会提供的每根电缆的最大长度是多少? 你的任务就是:编程求出每根电缆的最大可能的长度。 输入: 第1行,2个整数N和K,N是仓库中的电缆条数,K是竞赛委员会要求的电缆条数。其中1N1000, 1K10000。 第2..N+1行,每行为仓库中的一条电缆的长度,单位为米。 输出: 仅1行,为提供给竞赛委员的电缆最大长度(精确到小数点两位) 输入输出示例: MASTER.IN MASTER.OUT 4 11 2.00 8.02 7.43 4.57 5.39 例题3:图形中点的个数 给

文档评论(0)

1亿VIP精品文档

相关文档