C++ 一道习题

问题:

正在自学C++ 看译本大家都说好的《Accelerated C++》可是苦于没有答案
看到第3章 有这样一个习题 希望大家告诉我答案!~~如果能给我传份答案 我见感激不尽!~~:
 34  假设我们希望找出一个数值集合的中值:同时假定到目前为止,我们已经读进一些
数值了,而且不清楚还要再读进多少个值。证明:我们不能丢掉已经读到的任何值,提示:一
个可行的证明策略是,先假定我们可以丢掉一个值.然后找出我们的集合中末读的(也就是未
知的)那部分数值,要求这些数值将会使中值恰好就是我们丢掉的那个值-

============================================================================

回答:

因为后续数值是任意的,那么我们可以在丢弃一个值后,构造出一个后续数值集合,使得这个丢弃的值是整个集合的中值。

证明:在已经读了N个值后,我们丢弃了一个值x。可以计算出,在已读集合中,比x大的值有n1个,比x小的值有n2个,n1+n2 < N(注意n1+n2不一定等于N-1,因为可能存在于x相等的值)。
1) 首先考虑在已读集合中,x只有一个,那么
令d = max(n1,n2) - min(n1,n2)。再令集合s = { n1 > n2 ? d个(x-1) : d个(x+1) },s就是使的x成为整个集合中值的后续数值集合,从而x不能丢弃。

2) 在考虑x有多个的情况,设为n3个,此时n1+n2+n3 = N,并令y1为输入值中比x大的所有值中最小的一个(即大于x的子集的下确界),类似,令y2为小于x的子集的上确界。
令d= max(n1,n2) - min(n1,n2)。令集合s = { n1 > n2 ? d个y2 : d个y1 }
再令 y3 = (x-y2)/2,令集合s' = {(n3-1)个 y3 }。s并s'即是令x为中值的后续数值集合。因为当整个集合中有n3个x时,中值是x,如果去掉一个x,则要根据中值在此时的定义决定:
a)如果整个集合为偶数时,取中间偏小的那个为中值,那么去掉x后,y3就成为中值,这是错误的,说明x不能去除。
b)如果整个集合为偶数时,取中间偏大的那个为中值,可以令y3' = (y1-x)/2代替上面的y3,则y3'就是新的中值。这是错误的,同样说明x不能去除。

综上,在任何情况下去除输入数值中的任何一个,都有可能(即存在一个未输入数值集合)使得整个集合的中值发生改变。得证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值