一个整数列靠拢的问题

zeroieme 2009-11-11 02:02:12
给出一组已经排序的整数列A={a1,a2,……an},要求得到符合下面要求的整数列B={b1,b2,……bn}。
1、两数列之和相等;
2、相对的次序不变。如a1<a2,则要求b1<=b2;如a1=a2,则必须b1=b2;
3、符合1、2条件下数列B的方差最小。
(令数列相对靠拢)



假如两数列之和恰好被n整除就整个数列等于平均数,多数情况并不那么理想。
...全文
315 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
daidodo 2009-11-13
  • 打赏
  • 举报
回复
mark
zeroieme 2009-11-12
  • 打赏
  • 举报
回复
因为实际产生数据的不可分割区较大,因而不可分割区数量减少。所以采取全循环搜索。
zeroieme 2009-11-11
  • 打赏
  • 举报
回复
回复#12楼

感觉上,k越小,越有可能尾项过大。

递归不能避免“剩下r-(n-fi)个1”小于最后区间(bm,fm) 的情况。
qiuzhenguang 2009-11-11
  • 打赏
  • 举报
回复
那就不要取k=sum(A)/n 和 r=sum(A)%n
而是取得更小一点的k值,我认为,k可以取到k=sum(A)/n-m; 其中m是前述的区间总数。(k的下限应该是可以证明的,不会小于sum(A)/n-m,但是我没证明哦)
这时r=sum(A)%n + m*n;
再用这个 r 的代替9楼的 r 去递归.
FancyMouse 2009-11-11
  • 打赏
  • 举报
回复
那也就是说先把相同的数收缩掉,变成ai数组,然后有个辅助的ci数组记录重数。然后尝试构造bi数组。偶们知道bi数组的平均值是定值,所以只需要最小化平方和。假设ai是严格递增的情况下,bi不严格递增,所以估计可以用dp,但要做到强多项式还是要把界给卡一下。
zeroieme 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qiuzhenguang 的回复:]
首先统计,设有m段数字相同,第i段的起止区间下标记为(bi,fi);
那么m段区间为(b1,f1),(b2,f2),...,(bi,fi),(bm,fm)
在结果序列B中,这些区间内的数字是必须相同的,称这些区间为不可分割区,
这样,也就得到了可分割区(1,b1),(f1,b2),(f2,b3),...,(fi,bi+1),...,(fm,n);

记k=sum(A)/n,r=sum(A)%n;
(1)如果(n-r)落在可分割区,即fi <(n-r) <bi+1,那么可以得出前(n-r)个数是k,后r个数是k+1;
(2)如果(n-r)落在不可分割区,那么找出包含(n-r)的区间(bi,fi),fi前面的赋值为k,后面的赋为k+1;
这样,还剩下r-(n-fi)个1,对这些剩下的1的分配过程,其实与前面对r个1的分配过程类似:重复上述(1)(2)过程。

注:“bi+1”中(i+1)是下标。
[/Quote]

这样会使数列尾项过大,同时不一定有解。
原始数列 {2,6,6,6,6,6,6,7,7}
弱化条件2 {5,5,6,6,6,6,6,6,6}

按9楼方法 {5,5,5,5,5,5,5,8,9},而且方差比原始数列更大。

较好的方案{4,6,6,6,6,6,6,6,6}

qiuzhenguang 2009-11-11
  • 打赏
  • 举报
回复
首先统计,设有m段数字相同,第i段的起止区间下标记为(bi,fi);
那么m段区间为(b1,f1),(b2,f2),...,(bi,fi),(bm,fm)
在结果序列B中,这些区间内的数字是必须相同的,称这些区间为不可分割区,
这样,也就得到了可分割区(1,b1),(f1,b2),(f2,b3),...,(fi,bi+1),...,(fm,n);

记k=sum(A)/n,r=sum(A)%n;
(1)如果(n-r)落在可分割区,即fi<(n-r)<bi+1,那么可以得出前(n-r)个数是k,后r个数是k+1;
(2)如果(n-r)落在不可分割区,那么找出包含(n-r)的区间(bi,fi),fi前面的赋值为k,后面的赋为k+1;
这样,还剩下r-(n-fi)个1,对这些剩下的1的分配过程,其实与前面对r个1的分配过程类似:重复上述(1)(2)过程。

注:“bi+1”中(i+1)是下标。
qiuzhenguang 2009-11-11
  • 打赏
  • 举报
回复
解:首先,如果我们上述3个条件都考虑,但是条件2我们放弱一点:“如a1 <=a2,则要求b1 <=b2”。那么我们很容

易得到一种解法如下:求序列之和sum,设k=sum/n,r=sum%n;那么,整数列B为前(n-r)个是k,后r个是(k+1),这时它们

的方差是最小的。
其次,我们再把条件2收紧:......这个问题还要再想想。
zeroieme 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fire_woods 的回复:]
但是刚好在不加1和加1的临界处,ak=ak+1的话,就有点麻烦,还没想好整体算法.
[/Quote]
目前最头痛的就是这个
fire_woods 2009-11-11
  • 打赏
  • 举报
回复
但是剛好在不加1和加1的臨界處,ak=ak+1的話,就有點麻煩,還沒想好整體算法.
fire_woods 2009-11-11
  • 打赏
  • 举报
回复
假設S=a1+a2+……an;
有浮點數最優解.
b1=b2= ... =bn=S/n

剩下的問題就是怎么把S-(int)(S/n)*n,分配到bi中去.
從方差的角度來講,應該是{bi}序列中最后S-(int)(S/n)*n個數加1即可.

qiuzhenguang 2009-11-11
  • 打赏
  • 举报
回复
提供一个可能行的思路,不知道楼主有没有学过图像处理,里面有一种方法叫做“灰度直方图均衡”,就是把图像的值尽量均匀的分散到(0,255)区间。你现在的要求不是分散,而是靠拢,应该也可以套用类似的思想。只不过要有一些逆向思维。
FancyMouse 2009-11-11
  • 打赏
  • 举报
回复
假设a1+a2+...+an=xn+y,y=0,1,...,n-1,那么bi如下构造。假设ai是数组里第j小的数。如果j<y那么bi=x。否则bi=x+1。
hua_zhixing_ 2009-11-11
  • 打赏
  • 举报
回复
没大看懂题目……
绿色夹克衫 2009-11-11
  • 打赏
  • 举报
回复
用DP应该可以解,不过搜索范围可以先用上面的构造法得出2个近似解(大、小各一个),
然后在这个区间用DP应该可以解。

最近的研究表明我似乎只会用DP,对于大部分问题的回答是,“用DP应该可以解”

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧