两种算法的效率比较:查找行/列排序矩阵中负整数的数量

时间:2019-04-20 22:21:44

标签: python c arrays algorithm performance

以下是完整问题的链接:https://youtu.be/5dJSZLmDsxk 问题:制作一个函数,该函数返回二维数组中的负整数个数,以使该数组中每一行的整数的大小从索引0增加到n,而每列的整数从上到下执行相同的操作。 例如

{{-5, -4, -3, -2},
 {-4, -3, -2, -1},
 {-3, -2, -1,  0},
 {-2, -1,  0,  1}}

在视频中,CS Dojo提出了以下解决方案:

def func(M, n, m):
    count = 0
    i = 0
    j = m - 1
    while j >= 0 and i < n:
        if M[i][j] < 0:
            count += j + 1
            i += 1
        else:
            j -= 1
    return count

我的问题是:为什么/下面的代码效率不高? (唯一的区别是后者从左侧开始,并且它多次递增count <-但是这两件事有什么区别吗?

int rows = 3;
int cols = 4;

int count_neg(const int arrays[rows][cols]) {
    int count = 0;
    int pos = cols;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j <= pos; j++) {
            if (arrays[i][j] < 0)
                count++;
            else {
                pos = j;
                break;
            }
        }
        if (pos == 0)
            break; /*offers miniscule efficiency improvement?*/
    }
    return count;
}

请假定它们都是用相同的语言编写的。

1 个答案:

答案 0 :(得分:1)

区别在于第二个版本扫描所有负数矩阵,并花费 O(n * m)时间(整个矩阵可能是负数),而第一个则跟踪之间的边界否定元素和否定元素,并且花费 O(n + m)时间。

要了解第一个的工作原理,请考虑:每次迭代将递增i或递减ji只能递增 n-1 次,而j只能递减 m-1 次。