簡體   English   中英

使用Arrays.sort進行陣列分析的性能

[英]Performance of array analysis using Arrays.sort

我有一個以以下方式使用Arrays.sort(char[])的代碼:

    void arrayAnalysis(String[] array){
      for(int a=0; a<array.length;a++){
        char[] letters = array[a].toCharArray();
        Arrays.sort(letters);
        ...
        for(int b=a+1; b<array.length;b++){
          char[] letters2 = array[b].toCharArray();
          Arrays.sort(letters2);

          if(Arrays.equals(letters, letters2)
            print("equal");
        }
      }
    }

在這種情況下,n等於數組大小。 由於嵌套的for循環,性能自動為O(n ^ 2)。 但是,我認為Arrays.sort(帶有O(nlog(n)))也會影響性能,並使其比O(n ^ 2)差。 這種想法正確嗎?

最終的表現是O(n * nlog(n)*(n * nlog(n))還是我離開?

謝謝。

編輯:我應該補充一點,盡管n與數組大小有關,但Arrays.sort正在處理數組元素中的字母數。 如果應該將其添加到性能分析中,這就是我困惑的一部分。

Edit2:如果下選民留下評論為什么認為這是一個壞問題,那將很酷。

如果n是數組的長度,並且m是每個array[i]的長度,那么您將在n^2次迭代中的每一次迭代上執行O(m log m)排序,因此總的來說是O(n^2 (m log m)) (或O(n^3 log n)如果n == m 。[編輯:現在,我對此進行了更多思考,您的猜測是正確的,而這是錯誤的復雜性。以下仍然正確!]]

不過,這並不是必須的。 您可以只對數組進行排序,然后使用該數組進行嵌套的for循環。 看看a為0時會發生什么:首先對array[0]排序,然后在內部的for循環中,對array[1]array[n]排序。

然后,當a為1時,首先對array[1]排序,然后在內部for循環array[2]array[n]排序。 但是您已經對所有內容進行了排序 ,並且好像它在此期間不會發生變化。

您運行了n個外部循環,每個循環都運行n個內部循環,每個循環都調用O( n log n )算法,因此最終的結果(沒有層之間的任何交互作用)為O( n 3 log n )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM