排序矩阵搜索主定理分析
Posted
技术标签:
【中文标题】排序矩阵搜索主定理分析【英文标题】:sorted matrix search master theorem analysis 【发布时间】:2013-01-27 09:36:19 【问题描述】:所以问题是要找出 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.如果值较大,则在矩阵的右上角,右下角,左下角搜索值
【问题讨论】:
什么是top_row、top_col等。你能给出伪代码而不是实际代码吗..谢谢 @SajitKunnumkal ,我已经编辑了我的问题。进一步澄清我的解决方案。 top_row 是要检查值 x 的矩阵最顶层行的索引,top_col 等也是如此 f(n) 是合并片段的成本。 T(R) 不应该是 T(n) 吗? @thang by T(R) 这意味着 R = mxn(m 是最大行,n 是最大列),我已经将 f(n) 更改为 f(R) 跨度> 【参考方案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/4 的搜索空间并查看其余 3/4 的空间吗?我认为这更像是您正在查看 1/4 的搜索空间 3 次。 也许,但不一定……你无法从等式中看出这一点。 @SajitKunnumkal,也许您可以解释一下如何获得 O(log (4R/3)) ? thang 是正确的。我犯了一个错误@bysreg。更正我的答案【参考方案2】:我不知道这是否正确,但我正在使用主定理的案例 2
T(R) = 3T(R/4) + theta(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 时为真,因此时间复杂度为:
T(R) = theta(R^(log4(3)) * log(R)) = theta(R^0.8 * log(R))
【讨论】:
为什么是case 2?如果 c = Theta(n^(0.8)) 我们可以使用案例 2 - 我们可以证明吗? @smk case 2 要求是 f(R) = theta((R^c ) * (log(R))^k) 其中 c = logb a 对于某些常数 k>=0 是正确的.好吧,从我帖子的第二行可以看出 (f(R) = theta(1) = theta(R) = theta(R^(log4(3)))) theta(R^log4(3)) == theta((R^c) * (log(R))^k) 其中 k = 0以上是关于排序矩阵搜索主定理分析的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用cor函数计算相关性矩阵进行相关性分析,使用corrgram包可视化相关性矩阵行和列使用主成分分析重新排序下三角形中使用底纹和颜色表示相关性变量按其原始顺序绘制上三角形空白
R语言使用cor函数计算相关性矩阵进行相关性分析,使用corrgram包可视化相关性矩阵行和列使用主成分分析重新排序下三角形中使用底纹和颜色表示相关性(自定义颜色)上三角形中添加相关性数值
R语言使用cor函数计算相关性矩阵进行相关性分析,使用corrgram包可视化相关性矩阵行和列使用主成分分析重新排序下三角形中使用平滑的拟合线和置信椭圆,上三角形中使用散点图对角线最小值和最大值