簡體   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