【问题标题】:Time complexity of a binary search matrix二分搜索矩阵的时间复杂度
【发布时间】:2021-11-28 00:45:13
【问题描述】:

我在这个函数的时间复杂度方面遇到了一些问题,在我看来它是 O(nlogn),因为二分搜索(应用在矩阵的列中)花费 O(logn),而第一个 for 循环花费 O (n)(初始行数)。注意:矩阵总是 n*n 代码在这里

void findMaxTreasureAux(vector<vector<int>>& map, int columns, int& index_row, int& index_column, int limitsx) {
    
    int med = columns/2;
    int max = 0;
    
    for (int i = 0; i < map.at(0).size(); i++) {
        if (map[i][med+limitsx] > max) {
            index_row = i;
            max = map[i][med+limitsx];
        }
    }
    
    if (med+1+limitsx < map.at(0).size() && map[index_row][med+1+limitsx] > max) 
        findMaxTreasureAux(map, med, index_row, index_column, med+1);
    else if (med - 1 >= 0 && map[index_row][med-1] > max)
        findMaxTreasureAux(map, med, index_row, index_column, limitsx);
    else index_column = med+limitsx;
    
}

void findMaxTreasure(vector<vector<int>>& map, int columns, int& index_row, int& index_column) {
  
  if (map.empty()) return;
  index_column = 0;
  index_row = 0;
  findMaxTreasureAux(map, columns, index_row, index_column, 0); 
}

【问题讨论】:

  • 有什么问题?
  • 不知道我计算的时间复杂度是否正确。我不知道这种情况下的时间复杂度应该是 O(logn)*O(n) = O(nlogn) 还是 O(n) + O(logn) = O(n)。或者他们都是不正确的
  • 这段代码有什么作用?我不知道你在搜索什么。
  • 我正在矩阵中搜索具有此功能的数字:相邻的数字(水平和垂直)必须更低。示例 1 2 9 0 7 4 2 6 9 在这种情况下 7 是一个好数字,因为它大于 2、4、0 和 6。本练习中的矩阵可能有多个“好”数字。我通过了所有测试用例,代码应该可以工作
  • @JohnFilleau 我认为它有效,因为它实际上是变相的梯度上升(只是不必要的复杂并且做的工作比必要的多)。如果您从任意位置开始并从该位置走到更高的邻居,迟早您会用完更高的邻居并达到局部最大值。

标签: c++ time-complexity binary-search


【解决方案1】:

确实 O(logn)*O(n) = O(nlogn)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    相关资源
    最近更新 更多