使用有限内存将多个文件从一个驱动器移动到另一个驱

时间:2011-12-06 15:30:29

标签: algorithm complexity-theory

这是我被问到的面试问题,我仍在试图弄清楚是否存在多项式时间算法: -

考虑到驱动器A和驱动器B中看到和看不到的电影的文件大小,以及两者中的可用空间,确定是否可以仅使用免费移动一个驱动器中的所有看不见的电影并在另一个驱动器中看到驱动器中的空间。允许的唯一操作是move(source,dest),其中dest应该有比src文件大小更多的可用空间。

boolean canSegregateSeenUnseen(Drive A, Drive B);
where Drive is {
List<Integer> seenMoviesFileSizes;
List<Integer> unseenMoviesFileSizes;
Integer freeSpace;
}

我想过在初始状态下可以实现的所有可能状态上进行BFS,使用移动操作连接状态,但这似乎是指数级的。

有更好的方法吗?或者这可以简化为非多项式时间问题吗?

1 个答案:

答案 0 :(得分:2)

一种可能性:你必须移动的文件之一与两个驱动器上的可用空间总量完全相同(我不确定问题是否关心哪个驱动器最终观看的文件和未观看的文件,但即使不是,那么仍然可能在同一个驱动器上有两个这样大小的文件,一个观看,一个未观看。或者每个驱动器上有一个,无论是观看还是两个都未观看过。) / p>

然后“是否可以立即将所有可用空间放到目标驱动器上?”是(部分)子集和问题:“是否存在所有文件的子集,其总和是源驱动器的大小?”

所以我不认为这对于多项式时间解决方案看起来不错,尽管我承认我还没有正式减少子集和问题。

不过,即使这个问题是NP完全的,也不一定表明没有比你描述的蛮力更好的解决方案。