从跟随趋势的数组中查找最接近的元素

时间:2014-12-19 16:13:37

标签: algorithm

我有三个整数数组A,B,C。

我想找到最接近的a,b,c这样

a< b< c其中a属于A,b属于B,c属于C.

当我说最接近时,我的意思是(b-a)+(c-b)=(c-a)是最小的。

自己提出这个问题。我只能想到O(N ^ 3)

的蛮力

2 个答案:

答案 0 :(得分:1)

正如TravisJ提到的那样,您正在优化的值是(b-a) + (c-b) = c - a因此,您只需要最小化两个元素之间的差异 - 一个来自第一个集合,一个来自第三个集合。我能想到的一种可能的方法是 - 对C中的元素进行排序,然后迭代A中的所有元素。对于来自a的每个A,您可以在已排序的C中进行二分查找,以找到最接近给定c的元素a。优化以这种方式获得的所有值c-a。此解决方案将具有复杂性O(n * log(n))

编辑:(再次按照TravisJ的建议):您需要确保来自b的{​​{1}} B。为此,您还需要对a < b < c进行排序。现在,对于每个B,您在a中执行二进制搜索,以查找大于B的最小b,然后在a中找到另一个二进制文件以查找最小c {1}}大于c

答案 1 :(得分:0)

在C的每个元素c上循环。在B上使用二进制搜索以找到最大元素b,使得b <1。 C。在A上使用二进制搜索来找到最大元素a,使得&lt;湾(如果a或b不存在,请转到下一个c。)计算c-a;如果它比之前看到的任何c-a少,那么将其设置为迄今为止最好看的。最后回归到目前为止最好的,或者如果你找不到合适的三重奏那么“不可能”。这需要O(n log n)。