Java - 比较一长串整数

时间:2017-10-25 22:10:52

标签: java arrays list divide-and-conquer

我的代码超时,因为它效率低下。程序采用n行整数。每个连续的整数对表示单个点(x,y) 这是输入的一个例子:

  

-5 -10 20 25 30 2 -1 -40

输出:

java.awt.Point[x=-5,y=-10]
java.awt.Point[x=-1,y=-40]
java.awt.Point[x=20,y=25]
java.awt.Point[x=30,y=2]
4

我有代码对所有点进行排序。它们从最小到最大排序。哪里" x"值相等,然后检查y值。 问题是这样的:我需要计算一个点大于每个其他点(x和y)的次数。所以在上面的例子中,答案是4.

  • 第四点大于第一点和第二点。
  • 第三点大于第一点和第二点。

    结果为4.

如果点数相等,也增加计数器。

对于真正更长的整数行,我的程序超时(被杀)。我不能在这里提供输入,因为它太长了。我怎样才能提高复杂性?

public void calculateDomination(){
        int counter =0;
        int sizeOfList = this.coordinateList.size();
        for(int i = 0; i < sizeOfList ; i++){
            for(int j = i+1; j < sizeOfList ; j++){
                if(((this.coordinateList.get(i).x) < (this.coordinateList.get(j).x)) && ((this.coordinateList.get(i).y) < (this.coordinateList.get(j).y)) ){
                    counter++;
                }
                else if(((this.coordinateList.get(i).x) == (this.coordinateList.get(j).x)) && ((this.coordinateList.get(i).y) == (this.coordinateList.get(j).y)) ){
                    counter++;
                }
            }
        }
        System.out.println(counter);
    }

1 个答案:

答案 0 :(得分:2)

我发布的第一个想法,现在已删除,实际上无法正常工作。工作的那个:

对遇到的y值进行增量排序/计数:

在浏览列表时,保留到目前为止遇到的所有y值的TreeMultiset。在每个点上,检查当前size()值之前的headMultiset()个节点的y。由于只会添加x值较低的点的值,因此会为您提供当前点的计数。

我认为TreeMultiset所涉及的所有操作都是O(log(n)),所以这会使你的算法从O(n ^ 2)下降到O(n * log(n))。