在C中有效地遍历排序的数组

时间:2014-07-06 08:25:28

标签: c arrays sorting

我们有一个排序数组。如果差值为&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]。我必须为索引的多个值执行此过程,因此通过存储过去的结果或其他内容可以提高效率?如果是,那怎么样?谢谢。

2 个答案:

答案 0 :(得分:1)

最后,您必须遍历索引ij之间的所有元素,以验证距离。

但是你可以估计条目之间的平均距离来猜测它是否真实:

  • 假设您有索引ij。它们之间有n个元素,最大允许距离为k
  • 确定元素d与元素i之间的距离jd = abs(array[i] - array[j])
  • 计算这些点之间的平均距离aa = d / n
  • 如果a大于您的限制k,则表示这不是有效范围。
  • 如果a确实小于或等于您的限制k,则您必须遍历您的元素并验证它们。
  • 由于此迭代对所有元素都是独立的,因此如果您愿意,您可以多线程检查(并且它是合理的速度增益与开销)。

答案 1 :(得分:1)

最糟糕的情况是,你不能比明显的解决方案做得更好(逐个元素和检查)。这是一个演示它的例子:

int k = 2;
int a[] = {0, 2, 4, 6, ...};

a的任何元素都可以从任何其他元素到达。更改a的任何元素会中断已更改元素两侧元素之间的连接,检测断开连接的唯一方法是检查特定更改元素。这意味着要确定a的两个元素是否相互连接,你必须检查它们之间的每个元素,或者你没有看到的元素可能是打破链的元素。