【问题标题】:Binary Search of sorted 2d array已排序二维数组的二分搜索
【发布时间】:2015-03-10 23:42:43
【问题描述】:

我有一个程序使用二进制搜索来搜索二维数组。在这种情况下,我使用下面的矩阵并搜索整数 4,12,110,5,111。程序找到了除了 110 和 111 之外的所有这些,这是为什么?

       {1,3,7,8,8,9,12},
       {2,4,8,9,10,30,38},
       {4,5,10,20,29,50,60},
       {8,10,11,30,50,60,61},
       {11,12,40,80,90,100,111},
       {13,15,50,100,110,112,120},
       {22,27,61,112,119,138,153},


public static boolean searchMatrix(int[][] matrix, int p,int n) {  

int low = 0, high = n-1 ;  
while (low < high) {  
 int mid = (low + high) / 2;  
 if (p == matrix[mid][0])return true;  
 else if (p < matrix[mid][0]) high = mid - 1;  
 else if (p < matrix[mid+1][0]) { low = mid; break; }  
 else low = mid + 1;  
}  


int row = low;  
low = 0; high = matrix[row].length - 1;  
while (low <= high) {  
 int mid = (low + high) / 2;  
 if (p == matrix[row][mid]) return true;  
 else if (p < matrix[row][mid]) high = mid - 1;  
 else low = mid + 1;  
}  

return false;  
}  

【问题讨论】:

    标签: java arrays algorithm binary-search


    【解决方案1】:

    我宁愿说,您的算法首先找到了 4、5 和 12,这或多或少有点令人惊讶。原因是 4 出现在一行的第一个位置,而 5 和 12 满足它们小于下一行的第一个元素的条件。仅由于这一事实,它们才会在您算法的后半部分中被发现。该算法有点难以阅读,我没有评估 +/-1 魔法,但似乎该算法期望 110 和 111 实际出现在最后一行(因为 110 和 111 都大于 22)它们在哪里不是。

    如果我说得对,那么您的方法就有缺陷,因为实际上不可能通过查看一个数字来判断它将出现在哪一行,这是您首先尝试实现的目标。因此,任何先选择一行然后搜索一列的两阶段算法都必须失败。

    由于您对矩阵的限制很少(每一行和每一列都已排序),似乎二进制搜索根本不起作用:即使您的边界 lowhigh 是二维点不会有太大帮助。考虑矩阵中大于搜索点的任何元素。那么您所能说的就是您的搜索点 not 低于 并且 该元素的右侧(而您希望能够得出的结论是它在左侧和上方,但这不一定是真的 - 它可以在上下左右或左右),所以你只是切断了搜索空间的一小部分。

    【讨论】:

      【解决方案2】:

      您的问题是您做出了错误的假设,即您可以首先锁定搜索值的行,然后轻松地对该行进行二进制搜索。根本不是这样的。

      对于 110 和 111,每行的第一个元素总是小于您的搜索值,并且您的算法得出错误结论,即这意味着您的行必须是第一个循环后索引为 6 的数组。这根本不是真的。

      它适用于小数字的原因是因为您的算法很幸运能够在第一个循环中锁定正确的行...

      在每行和每列都按升序排序的二维矩阵上快速搜索的正确算法如下:

      1) 从右上角元素开始 2) 循环:比较这个元素 e 和 x ....i) 如果它们相等,则返回其位置 ...ii) e x 然后将其向左移动(如果超出矩阵范围则中断 return false) 3) 重复 i), ii) 和 iii) 直到找到元素或 返回错误

      我在这里找到了这个算法:http://www.geeksforgeeks.org/search-in-row-wise-and-column-wise-sorted-matrix/

      对于一个 n x n 矩阵来说是 O(n)。

      【讨论】:

      • 我不想挑剔,但这不是“二进制”搜索,是吗?总比没有好,仍然:-)
      • @SimonFischer 是的,你是对的,谢谢。我已经进行了更正。我想我称它为二分搜索是因为它遵循相同的模式“=:走另一条路”但从技术上讲,它不是二元搜索,因为它不会在每一步将搜索空间分成两半(如果它会不会是 O(log (n^2)) 比 O(n) 快我的错误。
      猜你喜欢
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2020-01-13
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多