设置对交叉点

时间:2014-04-16 21:34:07

标签: c++ algorithm

这是我的第一篇文章,所以请耐心等待。 如果有一种更优化的方法来检查大小为n的数组中的所有对,除了O(n ^ 2)之外,我总是徘徊。 除了通常的想法:

       for(i : n)
          for(j : n)
             process(a[i], a[j]);

如果哈希表可以解决这个问题,我就会徘徊......

非常感谢。

2 个答案:

答案 0 :(得分:0)

给出代码

   for(i : n)
      for(j : n)
         process(a[i], a[j]);

process可能会输出该对(它未指明process的作用),您想知道这是否可以通过某种更有效的方式完成。

不,一般情况下,为了输出每一对,您需要处理每一对。

但是,如果process是操作"什么都不做",那么这可以比实际循环更有效地完成,如果您的编译器认为这样做不会感到惊讶进行。

在"输出"之间并且"什么都不做"有一系列可能的行为。例如,也许process注意到所有值是否相同?在这种情况下,通过阵列的单次扫描可以完成这项工作。


顺便说一句,请注意n是一个不寻常的短名称。相反,使用字母a很常见。字母n更多表示计数。

答案 1 :(得分:0)

O(N²)行为直接来自对的数量。如果您需要处理所有对,无论顺序和存储策略如何,复杂性将至少为O(N²)。这被称为琐碎的界限,因为它从问题陈述中显而易见。

实现这种限制的双循环,尝试更复杂的方法没有任何好处。

唯一的捷径是当这些对是对称的并且只需要处理一次时:

for (i : 0 to N-2):
    for (j : i + 1 to N-1)
        Process(a[i], a[j]);

(如果必须处理+ 1对,则省略a[i], a[i]