快速计算以获得最小总和?

时间:2012-05-01 11:36:21

标签: sum

我有这样的数据

row1: x1 x2 x3... xn, y1,y2,...yn
row2: x2,x3,....xj, y4,y5,...ym
.....
row 1 million, x6,x2,x7...xk, y2,y3,...yl

每一行,x和y的数量可以是一百万甚至更多

每一行,某些数量的x或y可以具有相同的值。如第1行和第2行共有x2。

我的目标是找到哪一行给出x和y的最小总和。 例如,第1行的总和是sum(x1 + x2,.. + xn + y1 + y2 + ... yn)。

详尽的方式可以奏效但速度很慢,因为将有一百万*一百万次操作, 我相信有一些聪明的工作方式。

由于

更新

实际上上面的问题来自矩阵分区:,给出如下的矩阵5x5

1 2 3 4 5
2 3 4 5 6
2 3 4 5 8
9 1 2 3 5
1 5 2 5 6

至少有五种方法可以将此矩阵划分为两个子矩阵,例如

1 2 | 3 4 5
2 3 | 4 5 6
----+------
2 3 | 4 5 8
9 1 | 2 3 5
1 5 | 2 5 6

我得到两个子矩阵

1 2
2 3

4 5 8 
2 3 5
2 5 6

所以实际上1 2 2 3是我提到的x,而我提到的是5 5 8 2 3 5 2 5 6。 所以每一行都是矩阵中的一种分裂。 我不确定我是否清楚?请添加评论。

1 个答案:

答案 0 :(得分:0)

从我上面看到的是x和y模式在两行上重叠,因此给出一个列表{x1,x2,... xn}和{y1,y2,... ym}

给出i,j,k,l in(1,n)

和o,p,q,r in(1,m)

第一行是:{xi,xi + 1,...,xj} {yo,yo + 1,...,yp}

第二行是:{xk,xk + 1,...,xl} {yq,yq + 1,...,yr}

所以你真正需要找到的是行之间的差异并比较它,并且只有自重叠(具有相同值的部分)之后的总和将具有相同的总和。

你能告诉我们关于这两个名单的更多内容吗?他们排序了吗?你知道x和y的列表是独立于行的吗? x列表中的值是否会出现在y列表中?他们以任何方式排序吗?

了解这些事情可以更快地找出你需要的东西。

如果没有,你将不得不走行并确定重叠。

更新

这假设我们只通过对角线分解,但你可以推广算法来做其他的。

使用上面的示例让我们看看我们是否可以使用它,我正在按x和y集对数字进行分组。

第1行:{1} {3 4 5 6 3 4 5 8 1 2 3 5 5 2 5 6}
第2行:{1 2 2 3} {4 5 8 2 3 5 2 5 6}所以我们从第二列添加到x {2 3},从第二列添加{2}。                                         我们从第二列的y {3 3 1 5}中删除,从第二列中删除{4 5 6} 第3行:{1 2 3 2 3 4 2 3 4} {3 5 5 6}所以我们从第三列添加到x {3 4 4}并从第三列添加{2 3}。
                                        我们从y列中删除y {4 2 2},从第三行删除{5 8}

注意我没有计算总和。只是与第1行的差异

所以如果我们对除1之外的每一行进行推广。(如果你不需要总和,那么根本不计算第1行)

对于nxn matric M

delat row 1 = 0;

对于r = 2至r < Ñ

对于i = 1至i <= r,并且j = 1至j <1。 r(所以我们不计算elemtn M(r,r)两次)

Delta行r = Delta行(r-1)+ sum M(r,i)+ sum M(j,r) - 和M(r,n-i) - 和M(n-j,r)

小于第1行的行将为负数。到目前为止,你可以保持你看到的最小行delta,你会知道哪个分解总和是最小的。

这有意义吗?