【问题标题】:Time complexity of searching for target value in 2D matrix?在二维矩阵中搜索目标值的时间复杂度?
【发布时间】:2022-01-30 04:54:26
【问题描述】:

实际的问题很简单,实现一个算法,如果 target 值包含在 ma​​trix 中,则返回 true。这是我想出的两个解决方案。我不确定哪个更可取?我相信解决方案 1 更快,因为我们不需要构建新数组,但是这会明显更快吗?

解决方案 1:

var searchMatrix = function(matrix, target) {
    let cols = matrix[0].length;
    let rows = matrix.length;
    let left = 0; 
    let right = cols*rows - 1;
    
    while(left <= right) {
        let midIndex = left + Math.floor((right-left)/2);
        let midValue = matrix[Math.floor(midIndex/cols)][Math.floor(midIndex%cols)];
        console.log(midValue);
        if(midValue === target) {
            return true;
        }
        else if(midValue < target) {
            left = midIndex + 1;
        } else {
            right = midIndex - 1;
        }
    }
    return false;
};

解决方案 2:

var searchMatrix = function(matrix, target) {
    let arr = []
    for(let row of matrix) {
        arr = [...arr,...row];
    }
    let left = 0;
    let right = arr.length - 1;
    
    while(left <= right) {
        let middle = left + Math.floor((right-left)/2);
        if(arr[middle] === target) {
            return true;
        } else if(arr[middle] < target) {
            left = middle + 1;
        } else {
            right = middle - 1;
        }
    }
        
    return false;
};

根据我的理解,我们添加的主要步骤是将矩阵转换为常规数组。由于我们必须将每个元素添加到新数组中,这会使算法成为 O(n) 吗?

对于解决方案 1,我们不必创建一个新数组,所以我们会有常量空间,对吗? 我不太确定如何解释第一个解决方案在时间/空间方面更可取。

【问题讨论】:

  • 在时间复杂度方面是相似的,因为您使用的是二进制搜索,所以我可以说时间复杂度是 O(log(n)),就空间复杂度而言,第一个解决方案是 O(1) ,另一方面,第二个是 O(n),这取决于您在时间和空间方面的限制,但对我来说,第二个更具可读性,这是您开发代码时的另一个重要因素。
  • @AndresReneGutierrezT 完全正确!我更喜欢第二个,因为它更容易理解发生了什么。对于面试,您是否建议使用解决方案 2?也许两者都提到并谈论时间复杂度?
  • 如果您分解出一个采用矩阵和整体索引的函数并进行转换以获取相应行/列的值,那么第一个版本可能与第二个版本一样简单,无需额外存储,也无需更改算法复杂度。
  • @ScottSauyet 哦,是的!我认为这将是一个非常好的答案,因为它会被优化/更具可读性。谢谢先生。
  • @juanvicareer,面试我会选择第二个,因为你要尽量做到三大支柱,时间和空间复杂度还要可读性,所以为了协同工作,我会使用第二个解决方案。

标签: javascript algorithm binary-search destructuring


【解决方案1】:

根据添加到帖子中的 cmets,可读性和分析时间复杂度的能力将产生最佳答案。如果我们可以通过用于计算矩阵值的单独函数使其更具可读性,那么第一个选项可能是最理想的。

选项 2 确实占用了更多空间,因为我们正在创建一个额外的数组进行搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多