初识分治法,动态规划——中位数,Gray码与零钱问题

本文介绍了分治法在寻找中位数问题中的应用,详细阐述了奇数和偶数情况下中位数的判断过程。同时,探讨了动态规划在解决零钱问题中的思想,提供了数据输入和C++实现的说明。
摘要由CSDN通过智能技术生成

      通过学习算法设计与分析课程,我想对于那些经典的算法,除了在理论上认识他们外,最主要是在思想上学会他们,接受他们,这样不知不觉地培养了我们一种严密的思维能力,并且运用所学知识结合具体问题设计适用的算法的能力。而且那些经典算法也有很多复杂的应用领域,但是对于没有涉足这方面的人来说,由认识他们再上升到算法思想上的掌握也是很有必要的。

    下面介绍的几个应用例子都是相对来说不是很难的,主要是先有一种感性的认识。
  •     有关 分治法思想
    分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以: 1) 把它分成两个或多个更小的问题 ;
2) 分别解决每个小问题 ;
3) 把各小问题的解答组合起来,即可得到原问题的解答。
小问题通常与原问题相似,可以递归地使用分而治之策略来解决。
    中位数问题
    问题的提出
   对于两个长度均为 n 的已排序的序列 , 确定这两个序列的 2n 个元素的中位数
   解决此问题的算法思想
  设两个长度为 n 的数列分别为 x[ 0 : n -1] y[ 0 : n -1], 分别找出这两个数列的中位数 x[i]
y[ j ], 二者进行比较 , 根据比较结果可以在每个数列中减少一半的搜索范围 , 然后再分别取
两个子数列的中位数再比较 , 再减少搜索范围 , 继续下去直到找到最后结果
  求解过程
  查找范围确定:
  •  n为奇数时,令n=2m +1,则两个数列的中位数分别为x[ m ] y[ m ],则:
    x[0:m-1]<x[m]<x[m+1:2m]

    y[0:m-1]<y[m]<y[m+1:2m]
    x[m]<y[m]
    若整体中位数x[k]x[0:m-1]中,则
    x[k]<x[m]<x[m+1:2m] x[k]<y[m]<y[m+1:2m]
    x[k]至少小于2m+2n+1个数,而整体的中位数应该是第n个数,它小于n个数,所以整体中位数不在x的前半部分,同样不会在y的后半部分。
     x[m]至少小于n个数,y[m]至少大于n个数,所以这两个局部中位数都有可能成为整体中位数.    
     所以再次查找范围为x[m:2m]y[0:m]
  • n为偶数时,令n=2m ,则两个数列的中位数分别为x[ m-1 ] y[ m-1 ],则:
    x[0:m-2]<x[m-1]<x[m:2m-1]

    y[0:m-2]<y[m-1]<y[m:2m-1]
    x[m-1]<y[m-1]
    若整体中位数x[k]x[0:m-2]中,则
    x[k]<x[m-1]<x[m:2m-1] x[k]<y[m-1]<y[m:2m-1]
    x[k]至少小于2m+1即n+1个数,而整体的中位数应该是n个数,它小于n个数,所以整体中位数不在x的前半部分,同样不会在y的后半部分。
     x[m-1]至少小于n+1个数,所以其不会成为整体中位数,y[m-1]至少大于n-1个数,所以它有可能成为整体中位数
     所以再次查找范围为x[m:2m-1]y[0:m-2]
举个例子:
x={10, 15, 16, 19, 24}
y={11, 17, 18, 20, 23}
x1={16, 19, 24} y1= {11, 17, 18 }
x2={ 16,19} y2={ 17,18}
x2={19} y2={17}  ————
出口,应单独处理
x={10, 15, 16, 19}
y={11, 17, 18, 20}
x1={16, 19} y1= {11, 17}
x2={16} y2={17}
mid=16
数据输入
由文件 input.txt 提供输入数据。文件的第 1 行中有 1 个正整数 n n<=200 ),表示每个数组有 n 个数。接下来的两行分别是 X Y 数组的元素。 
输入文件示例
输出文件示例
input.txt
output.txt
3
5 15 18
3 14 21
14
C++ 实现:
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值