2013-09-20 166 views
-2

我有一個3級嵌套循環。內部價值取決於上面的價值。 O(n * n * n)的表現真的是一個殺手。另外,在即時循環中也可能有一些out.println,需要打印。我如何可以用遞歸來替換,或者是否有其他方法可以避免嵌套循環並提高性能。替換嵌套循環recurssion

示例代碼:

String[] strArray = getOuterArray(); 
for(String x : strArray){ 
     String[] internalStrArray = x.getArray(); 
     System.out.println("I am in first"); 
    for(String x: internalStrArray){ 
     String[] internalinStrArray = x.getArray(); 
     System.out.println("I am in second"); 
     for(String x: internalinStrArray){ 
      System.out.println("I am in third "+ x); 
     } 
    } 
} 

public String[] getOuterArray(){ 
} 

public String[] getArray(){ 
} 
+2

遞歸可能不會提高性能......它可能會使代碼更緊湊,更容易閱讀,但這是一個不同的故事。 – arshajii

+2

咦?如果你真的需要運行n^3次,那麼即使你使用遞歸,它仍然是n^3。 –

+0

爲什麼遞歸會改變O(n * n * n)?如果有的話,它會燒燬你的堆棧。 – Thilo

回答

1

遞歸是不會更快,然後循環。實際上,由於將函數調用推入堆棧,它可能會更慢。

現在你的代碼沒有意義了,你正在循環中打印出「我在第一/第二/第三」。你實際上並沒有做任何可以改進的算法。我唯一的主要建議是不要命名所有變量x,這非常令人困惑。

只要你有這三個循環,想要做所有的印刷,沒有什麼能使它變得更快。

+0

「我唯一的主要建議是不命名所有變量x,這非常令人困惑」......它也不是合法的Java。你不能有一個循環和另一個嵌套在循環中的循環,它們具有相同的循環變量。 – ajb

+0

這只是一個示例Sysout。實際上有一個我用Sysout取代的小邏輯。它甚至不是String數組,它是我們用來代替String數組的內部框架的對象數組。只是試圖複製類似的邏輯。對此感到抱歉。只是想了解是否有可能避免這種嵌套循環。 – MilesToGo

+0

@ user2800970取決於你在做什麼。如果你正在搜索,你可以使用二分搜索,但是如果你正在爲一組對象進行某些操作,而這些對象中有一個包含要處理的實際數據的列表,那麼似乎沒有辦法繞過它。 – Vulcronos