【问题标题】:Tile Searching (Nested For Loops)平铺搜索(嵌套 For 循环)
【发布时间】:2013-05-13 14:59:06
【问题描述】:

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

或者这是最快的方法吗?

【问题讨论】:

  • 视情况而定。数组中的值之间是否存在一些瞬时关系,或者您只是循环遍历每个值?您打算如何处理这些值?
  • 这对premature optimization 造成了影响。担心它当应用程序。明显减速。
  • 开发 > 运行 > 配置文件 > 决定。您希望您的代码在它可以行走之前运行...
  • 我想这是合理的——我的意思是我能看到的唯一改进是因为这是在一个函数内部,如果我是多任务处理它,但这可能会使代码变得不必要地复杂,正如你们都指出的那样,所以我会保持原样,谢谢。

标签: java performance for-loop


【解决方案1】:

听起来你正在做这样的事情:

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

【讨论】:

  • 上述两种方式是一样的,每一种方式都有一个迭代器,第一种迭代器是索引,第二种是列表迭代器..所以是一样的, 甚至复杂度都是一样的,因为有迭代器/索引
  • 我不确定您指的是哪两个代码块。如果您指的是前两个块,那么是的。正如我所说,两者都是 O(n^2)。如果您指的是后两个代码块,那么您就错了。 LinkedList 上的 get 运算符是 O(n),而来自 LinkedList 或 ArrayList 的迭代器上的 .next() 是 O(1)。如果你不相信我看一下代码。第三个代码块是上述所有代码块中最慢的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
相关资源
最近更新 更多