java - 多维数组的时间复杂度(每次切割成四分之一时)

标签 java arrays algorithm matrix

我们得到一个大小为 NxN 的矩阵,用多维数组表示,矩阵包含整数,我们假设 N=2^K。 我们也可以说矩阵是有序的,方法是将矩阵切割成 4 个四分之一(下图),第一个四分之一的每个元素都小于或等于第二个四分之一的元素,第二个季度小于或等于第三个季度,第三个季度中的每个元素都小于或等于第四个季度中的每个元素。 (递归地依此类推)

像这样:

1 2
3 4

排序矩阵的例子:

enter image description here

我们需要编写一个函数,如果矩阵中存在 num 则返回 true。 并使其尽可能高效。

我编写了以下函数:

public static boolean isExist(int[][] mat, int num)
{
    int start_rows = 0; 
    int start_columns = 0; 

    // If more then 4 elements
    // Loop log(base 4)n
    for (int elements_size = mat.length * mat[0].length, table_size, quarter_size,
            quarter1, quarter2, quarter3, quarter4; 
            (elements_size > 4); 
            elements_size /= 4) 
    {
        table_size = (int)(Math.sqrt(elements_size));
        quarter1 = mat[start_rows+(table_size/2)-1][start_columns+(table_size/2)-1];
        quarter2 = mat[start_rows+(table_size/2)-1][start_columns+table_size-1];
        quarter3 = mat[start_rows+table_size-1][start_columns+(table_size/2)-1];
        quarter4 = mat[start_rows+table_size-1][start_columns+table_size-1];

        if (num == quarter1 || num == quarter2 || num == quarter3 || num == quarter4) {
            return true;
        }

        // Decrease elements_size
        quarter_size = (int)Math.sqrt(elements_size/4);

        if (quarter1 > num) {
            // Dont do anything
        } else if (quarter2 > num) {
            start_columns += quarter_size;  // Increase columns
        } else if (quarter3 > num) {
            start_rows += quarter_size; // Increase rows
        } else if (quarter4 > num) {
            start_rows += quarter_size; // Increase rows
            start_columns += quarter_size; // Increase columns
        } else {
            return false; // bigger then quarter, fail.
        }
    }

    return (mat[start_rows][start_columns] == num || mat[start_rows+1][start_columns] == num || 
            mat[start_rows][start_columns+1] == num || mat[start_rows+1][start_columns+1] == num);
}

这是最有效的方法吗? 它的时间复杂度也是 O(logn)。 (我说得对吗?)

最佳答案

嗯,这是个好方法! 如果我没理解错的话,你想知道数组是否包含特定的 int 值; 好吧,我会使用以下方法(但你必须将其与 int [][] 数组相匹配):

HashSet<Integer> test= new HashSet<Integer>(Arrays.asList(intArray));
test.contains(intValue)

这种方法非常快,因为哈希码机制的复杂度为 O(1),但我认为通过 asList()- 它会导致数组列表的复杂度为 O(n)...对此我不确定!!

关于java - 多维数组的时间复杂度(每次切割成四分之一时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20869398/

相关文章:

java - "<identifier> expected"Java 编译错误

java - @BatchSize 但在获取 @ManyToOne 关联时有很多往返

python - 字符串列表到整数数组

PHP:变量为字符串时出现 "Array to string conversion"错误

javascript - 使用 Space 值从 JSON 中过滤数组

java - 我们应该在一个类中总是有一个零参数的构造函数吗?

algorithm - 如何数一棵树上的 child

java - 在迭代中从 HashSet 中删除元素

javascript - 如何修改调车场算法以使其接受一元运算符?

java - 尽管数字太大,但仍在处理中(忽略,我已修复)