我正在搜索一个tile数组,所以基本上有x和y - 例如10 x 10格。目前我在x和y上使用嵌套for循环,但我想知道因为我不太了解Java中的算法设计,有没有更快的方法来做到这一点?每个瓷砖我去(xn,yn),其中n是瓷砖编号,我执行操作。
或者这是最快的方法吗?
答案 0 :(得分: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('operation')。这是因为访问数组的元素是O(1)。
如果你有Lists而不是数组,那么你应该写代码如下:
List<List<Tile>> matrix;
//Some code to initialize matrix
for(List<Tile> row : matrix){
for(Tile cell : row){
//Perform the 'operation' on cell
}
}
这隐式使用List提供的迭代器。例如,如果List是一个ArrayList,迭代器的功能与第一个示例大致相同。如果List是LinkedList,则迭代器将存储对当前正在操作的列表中的节点的引用。对于LinkedList和ArrayList的花瓶,复杂性仍然存在:O(n ^ 2)* O('operation')
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 )。