排序矩阵搜索主定理分析

时间:2013-02-12 06:06:40

标签: algorithm matrix time-complexity divide-and-conquer master-theorem

所以问题是要找出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.如果值较大,则搜索矩阵右上角,右下角,左下角的值

2 个答案:

答案 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))