Java 平铺搜索(嵌套循环)

Java 平铺搜索(嵌套循环),java,performance,for-loop,Java,Performance,For Loop,我在一个平铺阵列上搜索,所以基本上有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 < matri

我在一个平铺阵列上搜索,所以基本上有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
    }
}
Tile[][]矩阵=新的Tile[10][10];
//一些初始化矩阵的代码
对于(int x=0;x
如果是这种情况,那么上述代码将是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
    }
}
列表矩阵;
//一些初始化矩阵的代码
对于(列表行:矩阵){
用于(平铺单元:行){
//对单元格执行“操作”
}
}
这隐式地使用列表提供的迭代器。例如,如果列表是ArrayList,则迭代器的功能与第一个示例基本相同。如果列表是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
    }
}
LinkedList矩阵=新建LinkedList();
//一些初始化矩阵的代码
对于(int x=0;x

这个例子是O(n^4)*O(“操作”),因为对LinkedList.get(x)的每次调用都是O(n)。记住,对数组或ArrayList的相同操作是O(1)。

这取决于具体情况。数组中的值之间是否存在某种暂时的关系,或者只是在每个值之间循环?你打算对这些价值观做什么?这些价值观是。当应用程序启动时,请担心它。明显减速。开发>运行>配置文件>决定。你想让你的代码在运行之前运行…我想这是合理的-我的意思是,我能看到的唯一改进,因为这是在一个函数中,如果我对它进行多任务处理,但这可能会使代码变得不必要的复杂,正如你所指出的,所以我将保持原样,谢谢。上面两种方法是相同的,每种方法都有一个迭代器,第一种方法中的迭代器是索引,第二种方法中的迭代器是列表迭代器。。所以它是一样的,甚至复杂度也是一样的,因为迭代器/索引我不确定你指的是哪两块代码。如果你指的是前两个街区,那么是的。正如我所说,两者都是O(n^2)。如果您引用的是后两段代码,那么您就错了。LinkedList上的get运算符是O(n),其中LinkedList或ArrayList的迭代器上的as.next()是O(1)。如果你不相信我,看看密码。第三个代码块是上述任何代码块中最慢的。