java - 使用 while 循环而不是 for 循环创建二维数组以提高运行时效率

标签 java arrays multidimensional-array big-o pseudocode

我在 Jana(基于 Java 的算法抽象表示法)中创建了以下代码,它创建了一个长度为 n 的二维数组:

fillMatrix(↕int matrix[1:n,1:n], ↓int n, ↓int a){

for(i=1…n){
    for(j=1…n){
    if(abs(↓(i-j))<=a){
        matrix[i,j]=1
    }else{
        matrix[i,j]=0
    }
    }
}
}

int abs(↓int i){
    if(i<0)
        return –i
    else
        return i
}

该代码的渐近运行时间为 O(n^2)。

我的问题是,假设矩阵的每个元素在调用时都初始化为 0,我怎样才能使这段代码更高效?

预先感谢您的帮助!

最佳答案

假设您只需初始化获得 1 值的单元格(其余单元格默认为 0):

如果a远小于n,则可以在O(n + a*n)中初始化获得1值的单元格时间。

例如,如果a == 0,则只需设置矩阵主对角线的n个单元格((0,0),(1,0),...,(n-1, n-1)) 至 1。

如果 a == 1,则需要设置主对角线的 n 个单元格 + 与主对角线相邻的对角线的 2*(n-1) 个单元格主对角线。

...

如果 a = c,则需要将 O(n) + O(2c*n) 个单元格设置为 1,即 O(n + c*n)

要实现此算法,您需要将 O(n^2) 循环替换为 2*a+1 O(n) 循环(每个相关对角线一个循环)。

关于java - 使用 while 循环而不是 for 循环创建二维数组以提高运行时效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44018168/

相关文章:

java - 本地计算机上日历一年中不同的第一周

c++ - 使 C++ 对象数组在 Python 中可迭代

java - 如何将一个对象数组的一部分复制到另一个对象数组

python - 使用 dask 进行 3D 体处理

java - 二维数组列表

Java 应用程序不再在 OS X 10.11 El Capitan 下运行

java - 为什么 test.no 在这里不起作用?

java - 从外部库访问内部类时出现NoClassDefFoundError

c++ - 在 C++ 中将指针数组分配给私有(private)变量

c++ - 修改具有 hashed_non_unique 键的 Boost Multi-Index Map 中的键范围