【问题标题】:Algorithm logic for filling packages with items of different dimensions用不同尺寸的物品填充包裹的算法逻辑
【发布时间】:2016-03-09 18:36:06
【问题描述】:

我正在为我正在开发的应用程序编写一些运输功能。其中一项要求是找到最有效的方法来确定哪些物品可以放入盒子中。我们还要求一次只能将两件物品放入任何一个盒子中,并且它们必须完全适合盒子,没有剩余空间。

我们将通过假设盒子和物品的大小是整数(而不是实际尺寸)来简化问题。

我需要编写一个函数,该函数将项目大小数组和盒子大小作为参数,并检查是否有两个项目可以完美地放入盒子中。

例如,假设我们想查看 2 个项目是否能完全填满一个大小为 4 的框。 尺寸为 1 和 2 的 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 次计算。

一种优化方法是删除数组中大于框大小的所有整数,并在找到匹配项后立即退出函数。

必须有更好的方法来优化它。任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: arrays algorithm math logic


    【解决方案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)
    

    【讨论】:

    • 感谢阿米特的回复。我正试图解决这个问题......所以我们基本上将项目和盒子大小之间的差异存储在一个临时数组中。然后检查循环中的每个项目以查找数组中的匹配值,并在每次迭代时将下一个项目添加到临时数组中。除非我感到困惑,否则不会只检查每个项目与已存储在临时数组中的先前项目吗?我看不出它将如何检查原始数组中尚未迭代的项目。你能解释一下吗?谢谢。
    • @LukeJames 不。这是在线性时间内完成的,因为您在这个额外的数组中查找非常多,您确切知道应该访问的位置。例如,如果您的盒子大小是 10,并且您看到数字 3,您会将其存储在 aux_array[7] (10-3=7) 中。然后,如果您稍后看到数字7,您现在可以通过简单地检查是否设置了aux_array[7],您已经看到了3
    • 我明白了。非常感谢。这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2020-12-26
    • 2012-07-18
    相关资源
    最近更新 更多