我有一个m×n实数矩阵。如何找到从每列中选择一个条目以使其总和大于某个阈值的所有方法?天真的方法是检查所有m ^ n方式,但有没有任何聪明的方法来做到这一点,以减少复杂性?我猜你不能打破O(m ^ n)界限,但也许另一种算法可以稍微减少前面的常数?
另外,如果这个问题本质上是一个众所周知的问题(或类似问题),请告诉我。提前谢谢。
一些小改进:
如果阈值足够高,则有一些矩阵条目是您永远不会选择的,因为无论您从其他列中选择哪些其他条目,总和都不可能足够高。我们可以在预处理中消除这些。
当您从左到右选择条目时,您会发现无论您如何从其余列中选择条目,只需退出。
修改:我想获取所选值的位置!
答案 0 :(得分:2)
在矩阵上选择的值的位置是一个问题,或者您只是想知道每个路径的每列选择的值?
如果它是选项2,那么在每列中排序值将允许您在列上的值不再满足它时立即截断搜索。 e.g:
8 7 4 9 2
5 6 4 8 2
3 3 2 3 1
2 2 2 1 1
假设您的阈值为25,那么当您选择8,7,4,3,2时,您可以在第4列和第5列停止搜索第1列,第2列和第3列的值8,7,4。所以上...
答案 1 :(得分:1)
这是一个基于你的改进的算法,它只运行一个比写出所有输出所需的更长的常数因子。
在开始之前,在每列中从最大到最小排序并计算第一行的后缀和(即,从右到左扫描以确定每个j,列j..n的最大贡献)。
现在使用您的修剪规则进行递归搜索:对于当前列,尝试从最大值到最小值的值并递归,如果剩余列的最大贡献加上到目前为止的总和小于行,则跳出行循环门槛。
要进行分析,请查看递归树。每片叶子都是一个解决方案,其大小为n,为每个祖先付出代价。每个节点都有不断的开销。
如果以某种方式你可以在次线性时间消耗每个解决方案,也许通过交织生产者和消费者,还有另一个优化,通过检测何时需要采取所有的计算,将计算降低到O(1)而不是O(n)最多剩余。这是通过按最大元素和第二大元素之间的间隙对列进行排序来实现的;然后,只要一个列从左到右只有一个选择,其他列也是强制的。