0

我正在搜索一个平铺数组,所以基本上有 x 和 y - 例如一个 10 x 10 的网格。目前我在 x 和 y 上使用嵌套 for 循环,但我想知道,因为我对 Java 中的算法设计知之甚少,有没有更快的方法来做到这一点?我转到 (xn,yn) 的每个图块,其中 n 是图块编号,我对其执行操作。

或者这是最快的方法吗?

4

1 回答 1

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)。

如果你有列表而不是数组,那么你应该编写如下代码:

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,则迭代器将存储对当前正在操作的列表中的节点的引用。对于 LinkedList 和 ArrayList 的花瓶,复杂性仍然存在:O(n^2) * O('operation')

不好的代码是:

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)。

于 2013-05-13T15:14:15.083 回答