这是我的第一篇文章,所以请耐心等待。 如果有一种更优化的方法来检查大小为n的数组中的所有对,除了O(n ^ 2)之外,我总是徘徊。 除了通常的想法:
for(i : n)
for(j : n)
process(a[i], a[j]);
如果哈希表可以解决这个问题,我就会徘徊......
非常感谢。
答案 0 :(得分:0)
给出代码
for(i : n)
for(j : n)
process(a[i], a[j]);
process
可能会输出该对(它未指明process
的作用),您想知道这是否可以通过某种更有效的方式完成。
不,一般情况下,为了输出每一对,您需要处理每一对。
但是,如果process
是操作"什么都不做",那么这可以比实际循环更有效地完成,如果您的编译器认为这样做不会感到惊讶进行。
在"输出"之间并且"什么都不做"有一系列可能的行为。例如,也许process
注意到所有值是否相同?在这种情况下,通过阵列的单次扫描可以完成这项工作。
顺便说一句,请注意n
是一个不寻常的短名称。相反,使用字母a
很常见。字母n
更多表示计数。
答案 1 :(得分:0)
O(N²)
行为直接来自对的数量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]
。