- 注册时间
- 2004-8-29
- 最后登录
- 1970-1-1
|
发表于 2005-8-15 17:18:00
|
显示全部楼层
以下是引用Lendy在2005-8-15 13:47:33的发言:<br>写了一个试验品,可以算出顶楼的最佳方案。
用这种思路写:怎么放才能使每张光盘所剩的空间最少。
[attachment:3877]
有点怀疑这种思路的正确性...
我有两种想法,不过时间复杂度都不是多项式规模的.
1.用迭代加深搜索算法
显然磁盘个数有一个下界: 文件总容量/单个磁盘容量
从这个值开始依次尝试增大直到找到一个符合要求的解为止,这个解肯定是最优的.
2.用动态规划
假设(A11,A12,...A1N1),(A21,A22,....A2N2),...(Am1,Am2,....,AmNm)
是一个满足条件的最优解序列.
我们可以在这个假设的前提下使用动态规划:
令 S[i,j] 表示序列中第i到第j个文件最少需要的磁盘数量.
则有:
a. Bi+...Bj<=磁盘容量 ,S[i,j]=1 (Bi表示序列中的第i个元素)
b. 否则 S[i,j]=min{ S[i,k]+S[k+1,j] | i<=k<=j-1}
这样可以得到一个动态规划的算法,时间复杂度是 O(n^3)
但是,n个文件共有n!种排列....
所以直接用这种算法是不实际的.不过我们可以看到:如果 Ai,j 是满足条件的一个序列.
那么将Ai,j 按各个磁盘打乱,或将各个磁盘内的文件序号打乱,依照这种算法依然可以求得最优解! 何况最优解很可能不止这一种情况.
也就是说,从直观上看,任意给出文件的一个排列,存在最优解的概率不会太小(也不大..),所以可以这样:
每次将文件序列随机重排一下序,然后用上面的算法求得这种情况得最优解.
只要这个过程进行的次数足够大,那么最优解中的最小值很可能就是整体最优解...
[此贴子已经被作者于2005-8-15 19:44:34编辑过]
|
|