C ++:如何计算方法的成本(算法分析)

时间:2012-03-07 13:19:27

标签: c++ algorithm

我是C ++和学习算法分析的初学者: 我正在编写一个方法,它返回一个2d数组的行号最多1个,输入数组中的每一行都被排序,当所有1的排序都在前面时命中0

1,1,1,0,0
1,1,0,0,0
1,1,1,1,0
1,0,0,0,0
1,1,1,1,1

该方法将从此数组返回5,这是代码:

int countone(int a[][]){
int count = 0, column = 0, row = 0, current = 0, max;
bool end = true;
do{
     if(a[row][column]==1)
     {
        current++;
        column++;
     }
     if(a[row][column]==0)
     {
        column=0;
        if(count<current)
        {
           count = current;
           max = row;
           current = 0;
        }
     row++;        
     if(a[row][column] != 1 && a[row][column] != 0)
     {
        end = false;
        return max;
     }
 }
while(end)

代码尚未测试,因此它可能包含错误和错误,但无论如何这不是主要观点。 我想找出这种方法的成本,但我不知道如何计算它。

我想要的成本是运行时间T(n)和Big-Oh表示法。如果可能,该方法应在O(n)时间内运行(不是O(n ^ 2))

3 个答案:

答案 0 :(得分:2)

This是如何评估代码的运行时复杂性的。对于您的代码,最糟糕的情况复杂性将是您创建{{1}后矩阵的大小(即,如果您的代码编译) } endrow等于矩阵的大小时为false。

答案 1 :(得分:1)

首先编写易于阅读和理解的代码

for(int row = 0; row < rowCount; ++row) {
    for(int col = 0; col < colCount; ++col) {
        if(a[row][col] == 0) {
            if(max > col) {
                 max = col;
                 max_row = row;
            }
            break;
        }
    }
}

大致相同,但你可以很容易地看到循环/语句的执行频率(这实际上你不会这样)。外部循环运行rowCount乘以内部最多colCount次(平均大小取决于)本身但行rowCount次。

然后查看哪些陈述费用多少。并将其与执行次数相乘(平均 - /最差情况下)。

说唯一昂贵的操作是++ with。然后你有rowCount * 1 (outer loop ++row) + rowCount * colCount * 1(inner loop ++col)

你得到rowCount x (colCount + 1)

答案 2 :(得分:0)

您可以使用数组的sorted属性来改善运行时间。没有理由重新开始并从每行的第一列进行扫描。一旦你扫描了1s直到你达到0,你知道任何后续行都不会有更长的1s字符串,除非它们在找到0的列中有1。你可以逐步地遍历矩阵,向右扫描直到达到0,然后向下扫描直到达到1.一旦你击中阵列的右边缘或下边缘就停止。

    int maxRow = 0;
    int i = 0, j = 0;
    for (;;) {
            if (a[i][j] == 0) {
                    // Try moving down one row
                    if (++i >= rowCount) break;
            } else {
                    // New record row length
                    maxRow = i;
                    // Try moving over one column
                    if (++j >= colCount) break;
            }
    }
    return maxRow;

请注意,输出是从0开始的,因此对于示例矩阵,结果将是第4行(而不是5)作为最多1的行。

扫描的矩阵元素数量最多为:T(n,m)= n + m - 1,即O(n + m)。
如果矩阵是正方形(m = n),则T(n)= 2n - 1,即O(n)。