这对我来说是一个相当大的问题,因为它需要对问题进行深入彻底的理解,并且还需要采取各种方法来达到最佳解决方案。
就此而言,我稍后会创建一个博客,因为我需要一点点时间来编写内容等等。所以,我会在准备好之后提供我的博客链接。
尽管如此,我发布这篇文章是为了让我们开始讨论。
第一件事:
编写一个有效的算法,在n x m表中搜索一个值(二维>数组)。此表按行和列排序 - 即
表[i] [j]≤表[i] [j + 1] 表[i] [j]≤表[i + 1] [j]。
需要注意的是,每个行和列都是单调排序的,即每个行和列按非递减(词典)顺序排序。
对于实际问题以及对此问题的讨论,请单击以下链接:
注意:这篇文章有第1,2和3部分。
1995年12月27日,来自澳大利亚格里菲斯大学的Hong Shen发布了针对该问题的最佳解决方案,即O(mlog(2n / m))用于串行算法。
Hong Shen-- Generalized Optimal Matrix Search
从那时起,就此进行了大量的论坛讨论,博客,在线和离线文章和出版物,但就目前而言,据我所知,O(((log(n))2)是最好使用改进的二进制搜索来声明这篇文章。
即使没有提供详细的算法。
现在,我已经针对这个问题做了不同的解决方案,希望能让最优解决方案低于当前最佳解决方案(我认为)
但是,我对分析算法的时间复杂性并不擅长。
以下只是其中之一。当我们做出决定时,我会继续提供其他人,从而在你所有的帮助下找到最好的。
以下是您分析时间复杂度的第一个
/* NIAZ MOHAMMAD
IntPol2d.cpp
1. Find the interpolated mid along column
2. Compare key with each elements in row-wise
along the found mid column
3. IF failed
DO
RECURSIVE call to IntPol2d
a. IF(key > a[row][mid])
THEN SET l = mid + 1 and d = row - 1;
b. ELSE set r = mid -1 and u = row;
*/
bool intPol2d(int mat[][6], int M, int N, int target, int l, int u, int r, int d, int &targetRow, int &targetCol,int &count) {
count++;
if (l > r || u > d) return false;
if (target < mat[u][l] || target > mat[d][r]) return false;
int mid = l + ((target - mat[u][l])*(r-l))/(mat[d][r]-mat[u][l]);
int row = u;
while (row <= d && mat[row][mid] <= target)
{
if (mat[row][mid] == target)
{
targetRow = row;
targetCol = mid;
return true;
}
row++;
}
return intPol2d(mat, M, N, target, mid+1, u, r, row-1, targetRow, targetCol,count) ||
intPol2d(mat, M, N, target, l, row, mid-1, d, targetRow, targetCol,count);
}
如果您需要整个可执行代码,请告诉我。
感谢您的耐心和帮助,并在讨论区看到你:
注意:@管理员或管理员,如果这不是这类冗长问题的正确位置,请告诉我,然后我将转到我的博客。
答案 0 :(得分:0)
您不必将数组视为二维事物。它只是一个mat [n],其中n = MxN并进行复杂度为O(log(n))的二进制搜索。请注意,这是日志基数2,是更糟糕的情况。请注意,复杂性不包括1以外的常量,因为它们不随输入大小而变化。实际最坏的情况是测试了2 * log(n)个元素。此外,您可以在第一次测试时击中您想要的那个。如果没有预先构建哈希表或其他关联数组,那么在正在查找的原始矩阵中指向元素的指针位于新数组中的索引处,则无法获得更快的速度。你想要值为46的元素,所以你在索引表中查看元素索引46,比如指向(M,N)=(2357,656)。繁荣,复杂性O(1)在可重用,内存昂贵之后,索引表已经建成。