我们有一个排序数组。如果差值为&lt; = some int k,我们可以在2个连续元素之间移动。如果可以从给定的索引移动到另一个索引,我们如何在C中有效地确定? 例如,我们的排序数组是A [5] = {1,3,5,8,20}。并且K被给出为2.即,当且仅当差值<1时,我们才能在连续元素之间移动。或者= K,在这种情况下为2。 给出2个指数,取指数0和3,即。 A [0] = 1且A [3] = 8。现在我们可以从A [0]移动到A [1] iff A [1] -A [0]&lt; = K,依此类推到A [3]。我必须为索引的多个值执行此过程,因此通过存储过去的结果或其他内容可以提高效率?如果是,那怎么样?谢谢。
答案 0 :(得分:1)
最后,您必须遍历索引i
和j
之间的所有元素,以验证距离。
但是你可以估计条目之间的平均距离来猜测它是否真实:
i
和j
。它们之间有n
个元素,最大允许距离为k
。d
与元素i
之间的距离j
:d = abs(array[i] - array[j])
。a
:a = d / n
。a
大于您的限制k
,则表示这不是有效范围。a
确实小于或等于您的限制k
,则您必须遍历您的元素并验证它们。答案 1 :(得分:1)
最糟糕的情况是,你不能比明显的解决方案做得更好(逐个元素和检查)。这是一个演示它的例子:
int k = 2;
int a[] = {0, 2, 4, 6, ...};
a
的任何元素都可以从任何其他元素到达。更改a
的任何元素会中断已更改元素两侧元素之间的连接,检测断开连接的唯一方法是检查特定更改元素。这意味着要确定a
的两个元素是否相互连接,你必须检查它们之间的每个元素,或者你没有看到的元素可能是打破链的元素。