提高此算法的时间复杂度?

时间:2017-02-18 15:10:49

标签: java algorithm time complexity-theory

我创建了这个算法,它所做的就是找到具有相同产品的整数对,并且成对中的整数必须不同。产品不得超过1024.这是我能做到的最简单的方法,有没有办法可以提高算法的效率和时间复杂度?

由于

# java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

1 个答案:

答案 0 :(得分:0)

您无法提高算法的时间复杂度。它是O(n^2),如果您要比较输入中的所有对,就可以做到这一点。

但这并不是说您无法改善运行时间。并非所有O(n^2)算法都同样出色;通过让它做更少的工作,你可以让它运行得更快;在这种情况下,这基本上意味着跳过检查产品不能相等的数字。

将这些对放入具有相同产品的桶中:

Map<Integer, List<int[]>> map = new HashMap<>();
for (int i = 0; i < nums.length; ++i) {
  for (int j = i+1; j < nums.length; ++j) {
    if (nums[i] == nums[j] || nums[i]*nums[j] > 1024) continue;

    map.computeIfAbsent(nums[i]*nums[j], ArrayList::new)
        .add(new int[] {nums[i], nums[j]});
  }
}

然后只迭代每个桶中的所有对对:

for (List<int[]> list : map.values()) {
  for (int i = 0; i < list.size(); ++i) {
    for (int j = 1; j < list.size(); ++j) {
      System.out.printf(
          "Matching pair found: %s %s%n",
          Arrays.toString(list.get(i)),
          Arrays.toString(list.get(j)));
    }
  }
}

在最坏的情况下,这仍然是O(n^2),这是所有数字对具有相同乘积的地方,这意味着对具有相等乘积的对的迭代只是迭代所有对。我怀疑这实际上是否可行,但是没有所有数字相等,检查禁止该数字中的数字是不同的。

您可以通过先排序nums,然后在nums[i]*nums[j] > 1024之后打破顶部内循环而不是继续来削减一些时间;这取决于nums是否值得对其进行排序(如果您不想更改输入数组,可能会复制它)。