找回密码
 欢迎注册
楼主: liangbch

[讨论] 数组拆分算法

[复制链接]
 楼主| 发表于 2009-1-9 14:10:02 | 显示全部楼层
定义: 数组的跨度:如一个数组中最小的那个数是x。则这个数组的跨度L=n-x+1,注意n并非这个数组中最大的那个数,而是所有数组中最大的数。 令tl为跨度和,定义加速比:s=(n+1)*n/2 /tl 对于我的应用,加速比是最重要的一个指标,加速比越大越好,加速比相同的情况下,拆出来的数组的越小越好。 三种算法实验结果;
N 算法 数组个数 加速比
100 Lbc 算法一 6 16.503268
Lbc 算法二 5 16.237942
Gxq 改进算法 6 11.85
1024 Lbc 算法一 104 10.555746
Lbc 算法二 72 11.848908
Gxq 改进算法 86 8.362281
综上所述,算法2得到的结果是目前最好的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-9 16:37:58 | 显示全部楼层
老兄的评判标准是第一优先级为加速比越大越好,第二优先级才是分组组数越少越好。(怎不早说啊? ) 就第一点来说,加速比实则仅与分组后各数组的最小数之和相关, 所以应尽量将小数字相对集中。 感觉 Lbc 算法二已经比较优化了, 但不排除可以将结果人工局部调整,以提高进一步加速比的可能。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-1-9 17:02:51 | 显示全部楼层
言之有理,仔细看了下算法2的运行结果,应该可以进一步调整/优化。不过人工调整比较麻烦,目前正考虑如何调整算法。等新的算法出来后,我将给出代码和运行结果。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-1-20 12:40:00 | 显示全部楼层
想了好久,一直没有找到令自己满意的算法,目前总算找到一个比较满意的,算法复杂度也较低。但还没有动手写程序,当然采用这个算法的程序也是最复杂的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-1-21 10:29:59 | 显示全部楼层
这个问题题确实很复杂,现在的方案都是找到一个相对好的解,要找到最优解或者更优解确实很难。 仍在思考中......
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-21 10:38:06 | 显示全部楼层
这类问题找到最优解本身就有很大难度,好比成绩从98提到99一样。 一般出于应用,优化解基本可以达到目的,最优解可再提高的程度比较有限。 不过,对你的新算法还是非常期待的。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-22 14:43:39 | 显示全部楼层
设要将1到n这n个数分组. 将n!写成素数相乘的形式, $n!$$=p_{1}^{c_{1}}*...p_{k}^{c_{k}}$。 对$p_{1},p_{2},...,p_{k}$取以2为底的对数. 得到一个序列LOG[]: $log_{2}{p_{1}},...,log_{2}{p_{1}},log_{2}{p_{2}},...,log_{2}{p_{2}},...,log_{2}{p_{k}}$. 对LOG[]中的数从大往小取数,放进大小为32的背包.对已经放东西的背包,维持这些背包按剩余空间的大小降序排列. 假设当前处理到LOG[ i ]. i)、如果已经放东西的背包序列中的第一个包的剩余空间大于LOG[ i ],则把LOG[ i ]放入,并且按剩余空间的大小,调整已经有东西的背包的顺序. ii)、如果不是,则把LOG[ i ]放入新的背包,并且按剩余空间的大小,调整已经有东西的背包的顺序.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-24 20:31:19 | 显示全部楼层
media2005你测试下你的想法吧 这个题目他们除了两个 还没别人参与过呢
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-1-28 12:54:33 | 显示全部楼层
27# 的做法能够保证每个数组的最小公倍数尽可能大,却不能保证数组尽可能少。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-1-29 15:54:53 | 显示全部楼层
$3491888400=16xx27xx25xx7xx9xx11xx13xx17xx19$ $3087564480=49xx64xx81xx5xx11xx13xx17$ $3171168000=121xx125xx128xx9xx7xx13xx2$ 49*64*81*121*125 = 3841992000 49*64*81*121*5*23 = 3534632640 49*64*23*29*31*5*9 = 2917938240 32*49*23*29*31*37*3= 3598790496 2 3 4 5 7 8 9 11 13 16 17 19 23 25 27 29 31 32 37 41 43 47 49 53 59 61 64 67 71 73 79 81 83 89 97 [ 本帖最后由 liangbch 于 2009-2-4 15:03 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 12:10 , Processed in 0.025393 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表