当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

C++数值集合试题得解析和讲解

    假设我们希望找出一个数值集合的中值:同时假定到目前为止,我们已经读进一些数值了,而且不清楚还要再读进多少个值。证明:我们不能丢掉已经读到的任何值,提示:一个可行的证明策略是,先假定我们可以丢掉一个值.然后找出我们的集合中末读的(也就是未知的)那部分数值,要求这些数值将会使中值恰好就是我们丢掉的那个值

    回答:

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

    证明:在已经读了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不能去除。

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

相关内容
赞助商链接