我是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))
答案 0 :(得分:2)
This是如何评估代码的运行时复杂性的。对于您的代码,最糟糕的情况复杂性将是您创建{{1}后矩阵的大小(即,如果您的代码编译) } end
和row
等于矩阵的大小时为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)。