【问题标题】:A better algorithm for this code [closed]此代码的更好算法[关闭]
【发布时间】:2017-11-12 13:37:07
【问题描述】:
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;
}

我怎样才能为这段代码提出更好的算法?我也需要他们的运行时间复杂性。请帮帮我。

【问题讨论】:

  • 如果你想修复一个算法,首先要了解它是如何工作的。用您自己理解的术语描述它计算的函数。
  • 如果您能找到算法的复杂性,请将其添加到您的问题中。然后您将能够判断哪种算法更好。如果你不知道如何找出算法的复杂性,你可能需要一门超级快速的算法理论课程。
  • 提示:一旦你知道a[i],你就知道什么值会产生0的总和。您是否知道提供快速查找的数据结构,或重组数组以便快速检查其中是否包含某个值的方法?

标签: algorithm complexity-theory


【解决方案1】:

简介

对数组排序,您可以获得仅控制小于或等于零的数字的优势。 事实上,考虑有序数组的第 i 个元素,你有三种情况

  • a[ i ] 匹配的元素的值等于 a[i] 的 绝对值,索引更高比我。
  • a[i] ==0 : 匹配项将仅与等于 0 的元素匹配。
  • a[i]>0 : 这种情况不会有任何匹配项。事实上,一个正数只能匹配他的加法逆,但是这些元素在前面的步骤中已经被控制了。

算法伪代码

int countPairs(Integer[] a) {
   a=quicksort(a); //return the ordered array
   int count,i=0;
   int index=a.lenght;
   int current;
   while(a[i]<=0 && i<a.lenght){
       current=abs(a[i]);
       while( a[index]>=current){
            if(a[index]==current){
               count++;
            }          
        index--;
       }
       i++;
   }
  return count;
}

复杂性

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

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

  • 中间情况:O(n*log(n)) 中间情况具有渐近相同的复杂度,但由于正数的存在,探索值将小于 n。

  • 更好的情况 Θ(n*log(n) 它在数组只有正元素时发生,因此没有匹配项并且搜索过程立即终止。所以复杂性只是由于订购过程。

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    相关资源
    最近更新 更多