2013-05-13 112 views
0

我正在尋找一個瓷磚陣列,所以基本上有x和y - 比如說10×10的網格。目前我在x和y上使用嵌套for循環,但是我想知道,因爲我對Java中的算法設計知之甚少,有沒有更快的方法來做到這一點?我去的每個瓦片(xn,yn)其中n是瓦片數量,我對其執行操作。瓷磚搜索(嵌套循環)

或者這是最快的方法嗎?

+0

這取決於。數組中的值之間是否存在某種瞬態關係,或者您是否簡單地循環訪問每個值?你打算如何處理這些價值觀? – christopher 2013-05-13 15:01:50

+2

這種[過早優化](http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize)。擔心應用程序時。明顯減慢。 – 2013-05-13 15:02:12

+1

開發>運行>配置文件>決定。你想讓你的代碼在它可以走路之前運行... – Gamb 2013-05-13 15:03:21

回答

0

這聽起來像你正在做的事情是這樣的:

Tile[][] matrix = new Tile[10][10]; 

//Some code to initialize matrix 

for(int x = 0; x < matrix.length; x ++){ 
    Tile[] row = matrix[x]; 
    for(int y = 0; y < row.length; x ++){ 
     Tile cell = row[y]; 
     //Perform the 'operation' on cell 
    } 
} 

如果是這樣,則上面的代碼會出現這種情況爲O(n^2)* O( '操作')。這是因爲訪問數組的元素是O(1)。

相反,如果你有列表,而不是數組,那麼你應該寫這樣的代碼:

List<List<Tile>> matrix; 

//Some code to initialize matrix 

for(List<Tile> row : matrix){ 
    for(Tile cell : row){ 
     //Perform the 'operation' on cell 
    } 
} 

這隱含使用由清單中提供的迭代器。例如,如果List是一個ArrayList,則迭代器的功能將與第一個示例相同。如果List是一個LinkedList,則迭代器將在當前正在操作的列表中存儲對該節點的引用。對於鏈表兩者的花瓶和ArrayList中的複雜性仍然是:爲O(n^2)* O( '操作'),這將是BAD

代碼是:

LinkedList<LinkedList<Tile>> matrix = new LinkedList<LinkedList<Tile>>(); 

//Some code to initialize matrix 

for(int x = 0; x < matrix.size(); x ++){ 
    LinkedList<Tile> row = matrix.get(x); 
    for(int y = 0; y < row.size(); x ++){ 
     Tile cell = row.get(y); 
     //Perform the 'operation' on cell 
    } 
} 

此示例將被O- (n^4)* O('operation'),因爲對LinkedList.get(x)的每次調用都是O(n)。記住對數組的相同操作或者ArrayList是O(1)。

+0

上面兩種方式是一樣的,每種方式都有一個迭代器,第一個迭代器是一個索引,第二個迭代器中有一個列表迭代器..所以它是相同的,即使複雜性是同樣因爲迭代器/索引 – Elior 2013-05-13 16:56:15

+0

我不確定你指的是哪兩個代碼塊。如果你指的是前兩個街區,那麼是的。正如我所說的,兩者都是O(n^2)。如果你指的是後面的兩個代碼塊,那麼你錯了。 LinkedList上的get運算符是O(n),其中來自LinkedList或ArrayList的迭代器上的.next()是O(1)。如果你不相信我看看代碼。第三塊代碼是上述任何塊中最慢的。 – patheros 2013-05-15 06:47:29

+0

我的意思是前兩個 – Elior 2013-05-15 07:24:25