【发布时间】:2011-02-26 22:02:15
【问题描述】:
给定数组:
int canvas[10][10];
int addon[10][10];
所有值的范围是 0 - 100,在 C++ 中添加这两个数组以使画布中的每个单元格等于自身加上插件中相应的单元格值的最快方法是什么?
IE,我想实现类似:
canvas += another;
所以如果 canvas[0][0] =3 并且 addon[0][0] = 2 那么 canvas[0][0] = 5
速度在这里至关重要,因为我正在编写一个非常简单的程序来暴力破解背包类型的问题,并且会有数千万种组合。
作为一个额外的小问题(如果你能提供帮助,谢谢!)检查画布中的任何值是否超过 100 的最快方法是什么?循环很慢!
【问题讨论】:
-
抱歉,我只能将此解决方案构建为控制台应用程序。
-
你为什么要暴力破解背包问题?有一个更快的动态编程解决方案。通常,改进算法比使用代码破解更好。
-
额外速度有多重要?如果它成为一个组合大的问题,您可能需要考虑并行化代码。你也特别想暴力破解这个问题吗?如果不是,我建议研究混合整数规划和分支定界算法。
-
您在寻找直接的 C/C++ 答案吗?如果您愿意放弃特定于体系结构的东西,我会看看是否有 SIMD 样式的指令(如 SSE)可以帮助并行化操作(并不是说我确切知道它是如何工作的)。
-
速度是相当重要的,在没有任何启发式的情况下,我认为我们正在寻找从几亿到多达 100 亿个可能的解决方案。现在唯一需要的计算是将数组加在一起,然后计算任何值是否超过 100。这是一个包装/背包问题,所以保证最佳解决方案的唯一方法是蛮力,我每次都需要找到最佳解决方案。
标签: c++ performance arrays micro-optimization simd