最小范围为3套

时间:2010-05-18 10:00:11

标签: algorithm

我们有三套S1,S2,S3。我需要找到x,y,z这样的 x E S1 是E S2 z E S3

让min表示x,y,z中的最小值 let max表示x,y,z的最大值 max-min表示的范围应为MINIMUM可能值

2 个答案:

答案 0 :(得分:4)

当然,IVlad描述的全暴力解决方案很简单,因此编写起来更容易,更快,但其复杂性为O(n3)

根据您的algorithm标记,我想发布一个更复杂的算法,其中O(n2)最坏情况和O(nlogn)平均复杂度(几乎可以肯定,但是我'我懒得做证明。)

算法说明

考虑考虑一些抽象的(X, Y, Z)元组。我们希望找到一个元组,它在最大和最小元素之间具有最小距离。我们现在可以说的是 distance 实际上是由我们的最大元素和最小元素创建的。因此,它们之间的元素值确实无关紧要,只要它实际上位于最大值和最小值之间。

所以,这是方法。我们分配一些额外的集合(让我们称之为S)并将每个初始集合(XYZ)合并为一个。我们还需要能够查找我们刚刚创建的集合中每个元素的初始集合(因此,如果我们指向S中的某个元素,那么就说{{1}并询问“这个人来自哪里?”,我们的应用程序应该回答类似“他来自S[10] ”的内容。

之后,让我们用它的键对我们的新集Y进行排序(在某些情况下,这将是O(n log n)或O(n))

确定最小距离

现在有趣的部分来了。我们想要做的是计算一些人为值,让我们称之为最小距离并将其标记为S,其中d[x]x中的某个元素。此值指的是最小S距离,可以使用序列中当前元素的前任/后继元素来实现。{/ p>

考虑以下示例 - 这是我们的max - min集(第一行显示索引,第二行 - 字母SXY引用初始集:

Z

假设我们想要为索引为4的元素计算最小距离。事实上,最小距离意味着 最佳 { {1}}可以使用所选元素构建的元组。

在我们的情况下(0 1 2 3 4 5 6 7 ------------------ 1 2 4 5 8 10 11 12 Y Z Y X Y Y X Z ),我们可以说我们的(x, y, z)对肯定会看起来像S[4],因为它应该有我们计算距离的元素(漂亮)很明显,呵呵)。

现在,我们必须填补空白。我们知道我们要寻找的元素应来自(x, y, z)(something, 8, something)。我们希望这些元素在X距离方面成为最佳。有一种简单的方法可以选择它们。

我们进行双向运行(向左运行,从当前元素向右运行)寻找第一个元素 - 不是 - Z。在这种情况下,我们会在两个方向上寻找max - minY中最近的两个元素(总共4个元素)。

这种发现方法是我们所需要的:如果我们在运行时选择X的第一个元素(左/右,无关紧要),那么该元素将更适合我们更好在距离方面跟随它的任何其他元素。发生这种情况是因为我们的Z集已经过排序。

如果是我的例子(计算索引编号为X的元素的距离),我们会在右侧标记索引为S4的元素,并将元素标记为从左侧开始索引67

现在,我们必须测试可能发生的4个案例 - 并采取案例以使我们的距离最小化。在我们的特定情况下,我们有以下内容(前一个例程返回的元素):

1

我们应该测试可以使用这些元素构建的每个(X,Y,Z)元组,以最小距离获取元组并为元素保存该距离。在此示例中,我们会说3元组的最佳距离为Z X Y X Z 2 5 8 11 12 。因此,我们存储(11, 8, 12) 4这里是元素索引)

产生结果

现在,当我们知道如何找到距离时,让我们为d[5] = 4集合中的每个元素执行此操作(此操作将在最坏的情况下花费5更好的时间 - 某事例如平均S

在我们的集合中的每个元素都有距离值之后,只需选择最小距离的元素并运行 距离计数 算法(如上所述),但现在保存O(n2)元组。这将是答案。

<强>伪代码

这是伪代码,我试图让它易于阅读,但它的实现会更复杂,因为你需要代码集查找*(“确定元素集”)。另请注意,确定元组和确定距离例程基本相同,但第二个产生实际元组。

O(nlogn)

<强> P.S

我很确定这种方法可以很容易地用于( - , - , - ,... - )元组搜索,但仍然会产生良好的算法复杂度。

答案 1 :(得分:3)

min = infinity (really large number in practice, like 1000000000)
solution = (-, -, -)
for each x E S1
    for each y E S2
        for each z E S3
            t = max(x, y, z) - min(x, y, z)
            if t < min
                min = t
                solution = (x, y, z)