[英]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.