2010-09-10 40 views
0

如何在應用「最佳實踐」時優化以下代碼以使其更高效,最佳方式是什麼?這只是一個簡單的學校項目,它的工作原理,我已經測試過。但我只是覺得有一種更好更有效的方法來編寫這種方法。你怎麼看?如何優化當前的getMax方法以檢索數組中的最大數字?

  1. 我有一個陣列被 預填充一束 數字。 getMax()方法 檢索 數組中的最大數字。但是,如果數組爲空,則它將返回-1
  2. nElems只是一個變量,用於跟蹤陣列中存在多少元素。

  3. array是在類的開頭聲明的私有數組。

    public int getMax() { 
    int k = 0; 
    int max = array[0]; 
    
    for(int j=0; j<nElems; j++) { 
        if(max < array[j]) 
         max = array[j]; 
    } 
    
    if(k == nElems) 
        return -1; 
    else return max; 
    } // end of method 
    

哦,我應該如何命名我ķ變量,以使其更具可讀性?它的目的是0,所以可以根據數組中元素的數量來檢查它是否返回-1或最高數字;

假設所有的數組值都是正值。

回答

3

它的目的是爲0,所以在陣列它可以被 覈對元件 的數目返回-1或 最高號碼;

零不需要名稱 - 如果您的意思是0,請使用字面值0

你的循環很好。有些事情可以嘗試優化它,但它們不一定有幫助。幾乎總是你可能只是爲JIT留下這種本地化的「鑰匙孔」優化。如果你只是想嘗試一些學習練習,那麼你可以嘗試如下:

  • 而不是使用數組兩次,將一個變量設置爲數組值,然後使用它兩次。
  • unroll the loop以不同的數量。如果numElem不是您展開次數的倍數,請小心不要出現訪問錯誤索引的錯誤。
  • 向後通過陣列而不是向前工作
  • 如果遇到值Integer.MAX_VALUE,則立即返回。你不會找到更大的東西。定義這種性能影響是很困難的,因爲它會加速MAX_VALUE的大數組,這個數組並不是太接近尾數,但很可能會減慢其他所有的速度。雖然它看起來有多大差異可能很有趣。
  • 任何你能想到的東西。

我並不是說這些中的任何一個都會產生變化,變快或變慢,但他們可以。所以,運行它們,時間多快。你最有可能學到的是,與將它留給JIT相比,這些東西不值得花時間。但你永遠不知道;-)

雖然,周圍的代碼可以清理,使其更容易理解,而不是使其更快。例如:

public int getMax() { 
    int max = -1; 
    if (nElems > 0) { 
     max = array[0]; 
     for(int j=1; j<nElems; j++) { 
      if(max < array[j]) 
       max = array[j]; 
     } 
    } 
    return max; 
} 

這也會消除代碼中的錯誤,即如果數組的大小爲0,則可以訪問第二行的出界。 ColinD的做法同樣出色,爲了多樣化我展示了不同的東西。

這裏的短代碼假定所有的值都是非負:

public int getMax() { 
    int max = -1; 
    for(int j=0; j<nElems; j++) { 
     if(max < array[j]) 
      max = array[j]; 
    } 
    return max; 
} 
+0

您的版本的方法存在一個主要問題:如果數組中的最大值小於-1,它就存在。 – ColinD 2010-09-10 02:15:05

+1

是的,好點。我猜測,由於提問者返回「-1」表示「空數組」,數組中的所有值都是非負數。我忘了說出我的想法。既然這只是一個猜測,我會解決的。 – 2010-09-10 02:17:59

+0

是的,你是對的數組索引超出界限的異常錯誤。感謝您糾正錯誤。 – 2010-09-10 02:51:13

-1

看看http://www.sorting-algorithms.com/它有幾個排序算法,解釋和動畫,讓你在排序時發生了什麼的好主意。希望能幫助到你。

+0

這真的沒有什麼關係的排序算法。 – ColinD 2010-09-10 02:01:07

4

您不需要跟蹤數組中nElems的元素數量,除非您的意思是您有一個部分填充的數組,並且nElems是其中實際具有值的插槽數。更可能的是,您應該只使用array.length來檢查陣列的長度。

你不需要變量k爲「0」。字面0是0的精細的表示所以,如果你想返回-1如果數組是空的,你可以用

if (array.length == 0) 
    return -1; 

也就是說啓動方法,返回-1空數組是怎麼樣的奇怪,因爲-1應該是該方法的有效結果。

0

在一個多處理器的理論(K處理器)系統,您可以通過將列表爲k子列表,加快速度。產生一個過程,找到每個子列表的最大值,然後找到最大值。

您可能會或可能不會遇到加速,如果

  1. 你有一個多處理器系統;和
  2. 名單是巨大的。
1

找到原始數據的最佳方法,例如int .. 使用int的整數intead。

Integer[] arr = { 6, 7, 10, 15, 2, 4, 8 }; 
Integer max = Collections.max(Arrays.asList(arr)); 

,做.. :-)

相關問題