需要找到数组第一行与其余数组之间的最低差异

时间:2013-05-07 19:02:06

标签: algorithm array-algorithms

好吧,我已经获得了多对元素(s,h),其中s在第2行数组的h行发送s元素。每行没有必要具有相同数量的元素,只知道一行中不能超过N个元素。

我想要做的是找到第一行的某个元素与其余元素之间的最小差异(!)。

因此,如果我有3行(101,92) (100,25,95,52,101) (93,108,0,65,200)我想要找到的是3,因为我必须选择92,我从95到92 = 3从第一到第二,93-92 = 1表格第一到第三。

我已经达到了这样的程度,即如果我有s行,每个n(i)元素和i=0..s,那么n0<=n1<=...<=ns以便拥有良好的平均值从第1行到其他行选择最佳匹配时的性能场景。

然而,在某些情况下,我想不出低于O(n 2 )或甚至可能是O(n 3 )的方式。有没有人建议采用相当改进的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

将所有行合并为一个列表,同时跟踪哪个元素来自哪里。

对此列表进行排序。

每行都有一个最后一个值变量。

对于排序列表中的每个项目,更新适用列表的最后一个值变量。如果并非所有行都设置了最后一个值,则不执行任何操作。如果它是第一个列表中的元素:

  • 重新计算最后一个值所有的最大差异。存储这种差异。

如果它是来自任何其他列表的元素:

  • 如果之前未设置所有值,请计算最大差异。否则,如果第一个列表的最后一个值与此元素之间的差异大于最大差异,则更新与此差异的最大差异。存储这种差异。

最小的差异是所需的值。

示例:

Lists: (101,92) (100,25,95,52,101) (93,108,0,65,200)

Sorted  0  25 52 65 92 93 95 100 101 101 108 200
Source  2  1  1  2  0  2  1  1   0   1   2   2

Last[0] -  -  -  -  92 92 92 92  101 101 101 101
Last[1] -  25 52 52 52 52 95 100 100 101 101 101
Last[2] 0  0  0  65 65 93 93 93  93  93  108 200

Diff    -  -  -  -  40 41 3  8   8   8   7   9
Best    -  -  -  -  40 40 3  3   3   3   3   3

最佳= 3根据需要。存储实际项目或之后找到它们应该很容易。

<强>复杂度:

n为项目总数,k为列表数量。

O(n log n)用于组合+排序。

扫描通过

O(nk)(最糟糕的情况),因为我们正在检查n个项目,并且在每个项目中,我们都会进行最大限度的O(k)工作。

所以O(n log n + nk)