我正在为我正在处理的应用程序编写一些运送功能。其中一个要求是找到确定哪些物品可以装入盒子的最有效方法。我们还要求一次只能在任何一个盒子中放置两个物品,并且它们必须完全适合盒子而不留下任何空间。
我们将通过假设框和项的大小是整数(而不是实际尺寸)来简化问题。
我需要编写一个函数,它将一个项目大小数组和框大小作为参数,并检查是否有任何两个项目可以完美地放入框中。
例如,假设我们想要查看2个项目是否正好填充大小为4的方框。 2件尺码为1& 2将无效,因为包装盒中有1个可用空间单位。
因此输入{Item Sizes:[1,2],target:4}将返回false
示例输入和输出:
input: {Item Sizes: [1,3,5], target: 2} output: false
input: {Item Sizes: [1,1,3,5], target: 2} output: true
input: {Item Sizes: [1,3,5], target: 4} output: true
input: {Item Sizes: [1,3,5,4], target: 7} output: true
显然我可以通过循环运行数组并将每两个数字加在一起以检查它们是否等于框大小,但我需要一种更有效的方法。如果我们这样做的话,数组中每个附加项的计算数量会呈指数增长。例如,给定这些参数......
input: {Item Sizes: [1,3,5,4], target: 7} output: true
如果我没有弄错(1 + 3,1 + 5,1 + 4,3 + 1,3 + 5,3 + 4等),那么以这种方式完成它将需要12次计算。 。但是,如果我们再添加一个项目,就像这样......
input: {Item Sizes: [1,3,5,4,6], target: 7} output: true
需要20次计算。如果" n"等于数组中的项目数,公式将是这样的......
n *(n-1)
从" n"中减去一个。因为你不能自己检查项目。 检查1000个项目的数组需要999000次计算。
优化的一种方法是删除数组中大于框大小的任何整数,并在找到匹配后立即退出函数。
必须有更好的方法来优化这一点。任何帮助将不胜感激。
感谢。
答案 0 :(得分:1)
首先,请注意一般问题(每箱无限数量的项目)是NP-Hard,实际上是子集和问题。
为了限制每个盒子的两个项目,可以使用哈希表(或者如果盒子的大小不是太高的数组)在数据的单次传递中完成,并存储差异来自盒子的大小。
python代码:
def FindPair(array, box_size):
s = {} #empty dictionary
for (i,x) in enumerate(array):
if x > box_size:
continue
if x in s:
print 'match for indices:', i, s[x]
return True
else:
s[box_size - x] = i
return False
print FindPair([1,3,5], 2)
print FindPair([1,1,3,5], 2)
print FindPair([1,3,5], 4)
print FindPair([1,3,5,4], 7)