繁体   English   中英

Java - 比较一长串整数

[英]Java - Comparing a long list of integers

我的代码由于效率低下而超时。 程序接收一行 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);
    }

我发布的第一个想法现在已删除,实际上行不通。 一个有效的:

使用遇到的y值的增量排序/计数:

当您浏览列表时,维护一个TreeMultiset遇到的所有y值的TreeMultiset 在每个点处,检查size()的的headMultiset()当前节点之前的y值。 由于只有来自具有较低x值的点的值才会被添加到其中,这将为您提供当前点的计数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM