所以问题是要找出x是否是按行和按列递增的排序矩阵的元素之一。
示例:
1 2 3
4 5 6
7 8 9
我有兴趣找到分裂的时间复杂性并征服这个问题的解决方案。我用谷歌搜索了它,但我发现只有O(m + n)解决方案,也来自Search a sorted 2D matrix。但他说(评论答案)“T(R)= 3T(R / 4)”,为什么f(R)= 0?
问题是使用主定理的分而治之解决方案的复杂性是什么? 在T(R)= 3T(R / 4)+ f(R)中,应该是f(R)?
如果有帮助,这是我的分而治之的解决方案:
bool find_x_in_matrix(int x, int mat[3][3], int top_row, int top_col, int bot_row, int bot_col) {
if(top_row > bot_row || top_col > bot_col)
return false;
int mid_row = (bot_row + top_row) / 2;
int mid_col = (bot_col + top_col) / 2;
if(mat[mid_row][mid_col] == x)
return true;
else if(mat[mid_row][mid_col] > x) {
return find_x_in_matrix(x, mat, top_row, mid_col, mid_row - 1, bot_col) ||
find_x_in_matrix(x, mat, top_row, top_col, mid_row-1, mid_col-1) ||
find_x_in_matrix(x, mat, mid_row, top_col, bot_row, mid_col-1);
}else if(mat[mid_row][mid_col] < x) {
return find_x_in_matrix(x, mat, top_row, mid_col + 1, mid_row, bot_col) ||
find_x_in_matrix(x, mat, mid_row + 1, top_col, bot_row, mid_col) ||
find_x_in_matrix(x, mat, mid_row + 1, mid_col + 1, bot_row, bot_col);
}
}
编辑以澄清解决方案:
算法: 1.将矩阵的中间元素与搜索值进行比较 2.如果值等于m(i,j)则返回true 3.如果值较小,则搜索矩阵右上角,左上角,左下角的值 4.如果值较大,则搜索矩阵右上角,右下角,左下角的值
答案 0 :(得分:1)
递归关系
T(R) = 3T(R/4) + c
很清楚,因为在每一步中,你都会丢弃1/4的搜索空间,并且会在剩下的1/4空间中查看3次。
根据维基, f(n)是在递归调用之外完成的工作的成本,其中包括划分问题的成本和将解决方案合并到子问题的成本。
我认为这只是一个常数。 f(n)可能不是零,但它绝对是一个常数值,并不依赖于搜索空间。
编辑:
我不确定如何使用主定理但是如果我们展开递归关系 我们得到
T(n) = 3^2* T(n/(4^2)) + c(1 + 3)
继续,T(n) = 3^k * T(n/4^k) + c(3^0 + 3^1 ... + 3^(k-1))
这是我被困的地方。我们可以减少RHS吗?忘了我的高中数学。
我有待纠正。
答案 1 :(得分:0)
我不知道这是否正确,但我正在使用主定理的案例2
T(R)= 3T(R / 4)+θ(1)
f(R)= theta(1)= theta(R)= theta(R ^(log4(3)))
f(R)= theta(R ^(log4(3)))= theta(R ^(log4(3))* logk(R))为真,k = 0,因此时间复杂度为:< / p>
T(R)= theta(R ^(log4(3))* log(R))= theta(R ^ 0.8 * log(R))