2014-12-06 26 views
-1

我有一種更新方法,每次屏幕刷新時都會調用它。基於多個變量值更新變量的高效解決方案

在這個方法裏面我檢查約50個物體的值爲零。如果所有值都爲零,則返回true,否則返回false。

這就是我已經實現並想知道是否有更好的方法來做到這一點。

public boolean update() 
{ 
    float totalVel = 0; 
    for(int i=0; i< this.numOfObjects; i++) 
    { 
     totalVel += BagOfWordsAverage[i]; 
    } 

    if(totalVel == 0) 
      return true; 
    return false; 

}

根據布爾值返回時,UDPATE函數的調用者允許來自用戶的某些輸入。所以如果False被返回,用戶不能點擊屏幕,但是在真實情況下用戶被允許做任何她想做的事情。

BagOfWordsAverage是一個浮點數組。我只需添加整個數組的值並檢查總數是否爲零。數組中的任何項都不會帶負值。

有沒有更好的方法來實現我想實現的目標?面臨的挑戰是如果對象數量增加到5000,我的方法是否會擴展?由於這是一個應用程序,速度非常重要。

回答

-1

只要您獲得非零值,您想要返回false嗎?這樣做:

for(int i = 0; i < foo.length; i++) { 
    if (foo[i] > 0) { 
     return false; 
    } 
} 
return true; 
+0

感謝您的回答,但如果在每個屏幕刷新次數增加時都不會檢查條件是50次還是可能是5000次拖動速度?我已經實現瞭如果在循環內,但選擇了上述解決方案,以避免條件。 – dhamechaSpeaks 2014-12-06 21:34:37

+0

本質上沒有。編寫一個循環,比較1個浮點數和它的時間。然後嘗試一百萬。 – 2014-12-06 21:35:59

2

如果所有的值都是零,我返回一個true,否則返回false。

因此,只要您看到一個非零值,立即可以返回false。 如果你走出循環, ,這意味着一切都爲零,你可以返回true

public boolean update() 
{ 
    for(int i=0; i< this.numOfObjects; i++) 
    { 
     if (BagOfWordsAverage[i] > 0) return false; 
    } 
    return true; 
} 

順便說一句更好的方法來遍歷數組中的Java:

public boolean update() 
{ 
    for (float value : BagOfWordsAverage) 
    { 
     if (value > 0) return false; 
    } 
    return true; 
} 

而且,Java中的命名約定是camelCase變量名, 所以我建議重命名BagOfWordsAveragebagOfWordsAverage

+0

感謝您的回答,但如果在每個屏幕上的對象數量增加,則不會檢查條件是否爲50次,可能是5000次刷新會降低應用程序速度?我已經實現瞭如果在循環內,但選擇了上述解決方案,以避免條件。 – dhamechaSpeaks 2014-12-06 21:34:13

+1

我認爲總結應該比條件檢查慢。但是,如果速度差異是一個嚴重問題,那麼也許你應該對它進行基準測試。 – janos 2014-12-06 21:39:34

+0

是的,這是一個好點janos。我應該以時間爲基準,然後做出決定。再次感謝。 – dhamechaSpeaks 2014-12-07 02:23:12

0

的一種方式,你可以稍微提高你的方法的速度將是檢查每個值,看看它是否是零,如果不是,馬上返回false。如果通過循環而沒有發現除零以外的任何值,則可以返回true。

public boolean update() 
{ 
    for(int i=0; i< this.numOfObjects; i++) 
    { 
     if (BagOfWordsAverage[i] != 0) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

請注意,當你的函數的實際平均情況運行時間將這種變化提高(即如果在數組中間的零,您的運行時間爲O(N/2 )而不是O(n)),大O分析通常會忽略除最高階函數以外的所有函數,並且將O(3n),O(n/2)等事物簡化爲O(n),因爲它們在線性時間運行。

就5000個物品的數組而言,平均情況下會花費原有功能的一半時間,但在最壞的情況下,速度會相同。如果我們不能假定這些非零數字的可能位置,那麼除了單獨檢查數組中的每個索引外沒有別的選擇。

希望這會有所幫助。

+0

感謝您的回覆。它有助於。 – dhamechaSpeaks 2014-12-07 02:19:33

1

一個有效的解決方案是不會循環的。您可以爲每個值大於零的索引創建一個映射。如果地圖的大小爲0,那麼您知道該數組的總數爲零。

你沒有發佈您的代碼結構,但這樣的事情可能會給你一個想法:

Map<Integer, Boolean> moreThanZero = new HashMap<>(); 

public void someActionOnArray(int index) { 
    /* 
    do some action 
    */ 

    float value = bagOfWordsAverage[index]; 

    if (value > 0) { 
     moreThanZero.put(index, true); 
    } 

    if (value == 0) { 
     if (moreThanZero.containsKey(index)) { 
      moreThanZero.remove(index); 
     } 
    } 
} 

public boolean update() { 
    return (moreThanZero.size() == 0); 
} 

是修改數組應目前指數在檢查修改後的值的每個方法。如果它大於零,則在地圖上標記索引。如果小於零,則將其刪除。

如果值大於零的索引大小很大,這可能會花費您一些內存,但是您將獲得更快的速度,因爲每次刷新時都不必循環。

+0

感謝您的回覆,但someActionOnArray將在每次刷新中爲所有數組元素調用,從而有效地在某處添加循環。無論我做什麼,我都無法避免循環。但是可以肯定地說,在值上添加會比添加if條件更快嗎? – dhamechaSpeaks 2014-12-07 02:15:15