我有这样的数据
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。 所以每一行都是矩阵中的一种分裂。 我不确定我是否清楚?请添加评论。
答案 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,你会知道哪个分解总和是最小的。
这有意义吗?