好吧,我已经获得了多对元素(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 )的方式。有没有人建议采用相当改进的方法来做到这一点?
答案 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)
。