我正在尋找一個瓷磚陣列,所以基本上有x和y - 比如說10×10的網格。目前我在x和y上使用嵌套for循環,但是我想知道,因爲我對Java中的算法設計知之甚少,有沒有更快的方法來做到這一點?我去的每個瓦片(xn,yn)其中n是瓦片數量,我對其執行操作。瓷磚搜索(嵌套循環)
或者這是最快的方法嗎?
我正在尋找一個瓷磚陣列,所以基本上有x和y - 比如說10×10的網格。目前我在x和y上使用嵌套for循環,但是我想知道,因爲我對Java中的算法設計知之甚少,有沒有更快的方法來做到這一點?我去的每個瓦片(xn,yn)其中n是瓦片數量,我對其執行操作。瓷磚搜索(嵌套循環)
或者這是最快的方法嗎?
這聽起來像你正在做的事情是這樣的:
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)。
上面兩種方式是一樣的,每種方式都有一個迭代器,第一個迭代器是一個索引,第二個迭代器中有一個列表迭代器..所以它是相同的,即使複雜性是同樣因爲迭代器/索引 – Elior 2013-05-13 16:56:15
我不確定你指的是哪兩個代碼塊。如果你指的是前兩個街區,那麼是的。正如我所說的,兩者都是O(n^2)。如果你指的是後面的兩個代碼塊,那麼你錯了。 LinkedList上的get運算符是O(n),其中來自LinkedList或ArrayList的迭代器上的.next()是O(1)。如果你不相信我看看代碼。第三塊代碼是上述任何塊中最慢的。 – patheros 2013-05-15 06:47:29
我的意思是前兩個 – Elior 2013-05-15 07:24:25
這取決於。數組中的值之間是否存在某種瞬態關係,或者您是否簡單地循環訪問每個值?你打算如何處理這些價值觀? – christopher 2013-05-13 15:01:50
這種[過早優化](http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize)。擔心應用程序時。明顯減慢。 – 2013-05-13 15:02:12
開發>運行>配置文件>決定。你想讓你的代碼在它可以走路之前運行... – Gamb 2013-05-13 15:03:21