我的代码超时,因为它效率低下。程序采用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);
}
答案 0 :(得分:2)
我发布的第一个想法,现在已删除,实际上无法正常工作。工作的那个:
对遇到的y
值进行增量排序/计数:
在浏览列表时,保留到目前为止遇到的所有y
值的TreeMultiset
。在每个点上,检查当前size()
值之前的headMultiset()
个节点的y
。由于只会添加x
值较低的点的值,因此会为您提供当前点的计数。
我认为TreeMultiset
所涉及的所有操作都是O(log(n)),所以这会使你的算法从O(n ^ 2)下降到O(n * log(n))。