【问题标题】:Efficiency comparison of two algorithms: Find the number of negative integers in a row-wise / column-wise sorted matrix两种算法的效率比较:查找行/列排序矩阵中的负整数个数
【发布时间】:2019-09-10 16:38:28
【问题描述】:

这里是完整问题的链接: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;
}

请假设这些都是用同一种语言编写的。

【问题讨论】:

  • 向两个解决方案添加一个loopCount 变量,并在if 之前增加loopCount。每个解决方案的loopCount 是什么?
  • @user3386109 第二个程序是 8,第一个程序是 6,二维数组 {{-5, -4, -3, -2},{-4, -3, 2, 1}, {2, 3, 4, 5}}。感谢您的帮助。
  • 不客气。 (提示:我会尝试一个 10x10 数组,其中所有数字都是负数,以查看算法之间的真正差异。即使是问题中的数组也会显示出更大的差异。)

标签: python c arrays algorithm performance


【解决方案1】:

不同的是,第二个版本扫描所有负数矩阵,耗时O(n*m)(整个矩阵可能是负数),而第一个版本跟踪之间的边界负元素和非负元素,耗时O(n+m)。

要了解第一个是如何工作的,请考虑:每次迭代都会增加 i 或减少 j。 i 只能增加 n-1 次,j 只能减少 m-1 次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多