我们有三套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可能值
答案 0 :(得分:4)
当然,IVlad描述的全暴力解决方案很简单,因此编写起来更容易,更快,但其复杂性为O(n3)
。
根据您的algorithm
标记,我想发布一个更复杂的算法,其中O(n2)
最坏情况和O(nlogn)
平均复杂度(几乎可以肯定,但是我'我懒得做证明。)
算法说明
考虑考虑一些抽象的(X, Y, Z)
元组。我们希望找到一个元组,它在最大和最小元素之间具有最小距离。我们现在可以说的是 distance 实际上是由我们的最大元素和最小元素创建的。因此,它们之间的元素值确实无关紧要,只要它实际上位于最大值和最小值之间。
所以,这是方法。我们分配一些额外的集合(让我们称之为S
)并将每个初始集合(X
,Y
,Z
)合并为一个。我们还需要能够查找我们刚刚创建的集合中每个元素的初始集合(因此,如果我们指向S
中的某个元素,那么就说{{1}并询问“这个人来自哪里?”,我们的应用程序应该回答类似“他来自S[10]
”的内容。
之后,让我们用它的键对我们的新集Y
进行排序(在某些情况下,这将是O(n log n)或O(n))
确定最小距离
现在有趣的部分来了。我们想要做的是计算一些人为值,让我们称之为最小距离并将其标记为S
,其中d[x]
是x
中的某个元素。此值指的是最小S
距离,可以使用序列中当前元素的前任/后继元素来实现。{/ p>
考虑以下示例 - 这是我们的max - min
集(第一行显示索引,第二行 - 字母S
,X
和Y
引用初始集:
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 - min
和Y
中最近的两个元素(总共4个元素)。
这种发现方法是我们所需要的:如果我们在运行时选择X
的第一个元素(左/右,无关紧要),那么该元素将更适合我们更好在距离方面跟随它的任何其他元素。发生这种情况是因为我们的Z
集已经过排序。
如果是我的例子(计算索引编号为X
的元素的距离),我们会在右侧标记索引为S
和4
的元素,并将元素标记为从左侧开始索引6
和7
。
现在,我们必须测试可能发生的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
。
在我们的集合中的每个元素都有距离值之后,只需选择最小距离的元素并运行 距离计数再次使用em> 算法(如上所述),但现在保存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)