递归bin打包算法不会扩展

时间:2013-02-25 21:19:34

标签: java algorithm data-structures recursion stack-overflow

我完成了一项规格要求的作业:

  • 递归解决方案
  • 容量< = 100
  • values.length< = 25
  • 只有参数是容量和索引
  • 允许重复使用值

我花了好几个小时阅读垃圾箱包装和背包问题。

以下工作但效率很低。我得到一个堆栈溢出十几个左右的值。非常低效,无法扩展,我不知道从哪里开始。

建议将不胜感激。是的,这是一项学术任务,但我宁愿清除问题而不是放弃并赚取B。

public void calculateCombinations(int capacity, int index) {
    count++;
    if(index < values.length) {
        if(values[index] <= capacity) {
            currentSolution.addLast(index);
            if(values[index] == capacity)
                flushSolution();
            else
                capacity -= values[index];
        }
        calculateCombinations(capacity, index + 1);
    } else
        if(currentSolution.peekLast() != null)
            calculateCombinations(capacity + values[currentSolution.peekLast()], currentSolution.removeLast() + 1);
}

1 个答案:

答案 0 :(得分:3)

装箱问题的关键启发式方法是始终先装入最笨拙(最大)的物品。例如,如果你正在装一辆移动的卡车,你先放钢琴,然后再担心较小的东西。我们的想法是最大化您的灵活性。

另一种技术是我称之为“包围”。假设您正在寻找两个总和为50的数字,并且您有一个类似{2,3,9,18,24,29,37,45}的列表。您不必检查每个组合,因为您不能有超过25或25的两个值。您只需要检查列表每侧的数字,即45 + 2,45 + 3,45 + 9,STOP,下一个号码,37 + 2,37 + 3等。这是包围。通过创建一组规则并围绕均值进行包围,您只需要检查一小部分可能的组合。

Bin打包是一个搜索问题,因为在很多情况下,因为您无法枚举所有可能的组合。这就像国际象棋;你无法计算每一个可能的举动,你只是想找到一个好的举动。