这个代码的更好的算法

时间:2017-11-12 13:37:07

标签: algorithm complexity-theory

public class twoSumProblem {
public static int bruteForce(Integer[] a) {
int count = 0;
for (int i = 0; i < a.length; i++)
for (int j = i+1; j < a.length; j++) if (a[i] + a[j] == 0) count++;
return count;
}

我如何为此代码提出更好的算法?我还需要他们的运行时间复杂性。请帮帮我。

1 个答案:

答案 0 :(得分:1)

简介

对阵列进行排序可以获得控制仅低于或等于零的数字的优势。 实际上,考虑到有序数组的第i个元素,你有三种情况

  • a [i]&lt; 0:匹配将使用等于[i]的绝对值的元素,其索引高于i。
  • a [i] == 0:匹配仅与元素等于零。
  • a [i]&gt; 0:此案例不会有任何匹配。事实上,正数只能匹配他的加法逆,但这些元素已在前面的步骤中得到控制。

算法伪代码

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

复杂性

n = a.lenght ,订购过程需要O(n * log n),所以:

  • 最糟糕的情况:O(n * log(n)) 搜索对需要复杂度O(n)。这种情况对应于数组仅由负值组成的情况。

  • MID CASE:O(n * log(n)) 中间案例具有渐近相同的复杂性,但由于存在正数,所探索的值将小于n。

  • 更好的情况Θ(n * log(n) 当数组只有正元素时会发生这种情况,所以没有匹配,搜索过程立即终止。因此,复杂性仅取决于订购流程。