数组搜索的时间复杂度

时间:2017-04-21 01:15:40

标签: java arrays time-complexity

我正在编写函数来检查给定值是否包含在矩阵中。该矩阵具有以下属性: •每行中的整数按从左到右的升序排序。 •每列中的整数按从上到下的顺序排序

public static boolean searchMatrix(int target, int[][] matrix)
{
    for(int i = 0;i <= matrix[0].length;i++)
    {
        for (int j=i; j<matrix.length;j++)
        {
        if(target == matrix[i][j])
        return true;
        }
    }
    return false;
}

我想知道天气这个节目的时间复杂度为O(N)。 如果不是我应该做什么改变进入O(N)。

5 个答案:

答案 0 :(得分:1)

我认为搜索可以在线性时间内完成。将以下4×4矩阵视为视觉:

1 2 4 6
2 3 5 7      ascending from left to right
3 4 6 8      and from top to bottom
4 5 6 9

如果我们搜索值5,我们可以从左上角开始,然后向右走,直到我们找到该值,或者遇到一个大于目标5的数字。在这种情况下,我们点击6.然后,我们可以回滚到4,然后向下前进到更高的。保证第一行中的每个先前值都小于目标,并且该列中的下一行中的每个值都大于第一行上的值。

这是一种粗略的线性方法。一个很好的类比就是在山的周围走动,寻找一定的高度。如果在每个地点,我们要么找不到我们想要的高度,要么只找到太高的点,我们就继续行走。

答案 1 :(得分:0)

你编写它的方式(暴力计算)的最坏情况时间复杂度为O(N ^ 2)。既然你说数组是排序的,你可以实现binary search,它的最坏情况时间复杂度为N(2 * log(N))。

答案 2 :(得分:0)

假设n x m矩阵,你的算法是O(n * m),因为它(可能)迭代所有行和列(即所有元素)。

但是,存在一种算法,即O(log(m + n))。

因为这是一次在线编码访谈(我很精神),我只会给你提示:

  • 给定坐标(x,y)处的元素,可以知道目标可能在哪里?
  • 如果分别处理x和y,你会怎么做?

答案 3 :(得分:0)

如上所述,对于方阵,您的算法为O(N * M)或O(N ^ 2)。

你可以用一个循环来完成:

基本上从右上方开始,如果数字太大则检查单元格如果数字太小则向左移动。如果你从两侧的边缘掉下来,那么数字就不存在了。

beginingOfMonth

答案 4 :(得分:0)

你说矩阵是排序的,你可以使用二进制搜索来找到目标。并使用两个单独的一层循环,首先搜索行,然后是column.it的o(N / 2)。