【发布时间】:2014-11-06 19:44:28
【问题描述】:
我知道 鞍背搜索算法 可以在 O(n) 时间内在 已排序的二维数组(数组已排序在 X 维和 Y 维中)(或称其为已排序的 2d square 矩阵),没有重复项。从我读过的所有文章来看,它似乎是二维平方排序矩阵的最佳算法。对于那些不知道鞍背算法如何工作的人:
将二维数组想象为二维矩阵。
1. Start at the top-left corner. i.e. Initialize row to its maximum value and column to its minimum value.
2. Check at (row, column). If it’s value is less than the target value, then increase column by one.
3. If it's greater than the target value, then decrease row by one.
4. Do this until we reach the element or boundary
示例:
在下面的二维排序数组中找到 54。
现在我如何以一种有效的方式修改此算法以搜索二维排序数组中可能有重复项的元素的所有出现。 示例: 在下面的数组中找到所有出现的 54。
【问题讨论】:
-
找到匹配项后,尝试按降序进行,直到找到不同的值。接下来从发生点往上升的方向走,当值不同时停止。
-
如果你降落在中间的 34 值,向左走直到没有更多的 34。这是起点。向右走,直到没有更多的 34。这是结束标记。由于矩阵是排序的,根据定义,所有相同的值都将放在一起,除非矩阵没有重复项。否则,请澄清“搜索所有出现”的含义。
-
您的第二张图显示了算法的错误执行。
-
@TheGame:对。你能弄清楚如何追踪一大块 54 的上下轮廓吗?这是唯一缺少的成分。
-
@ThomasMatthews:通过“搜索所有出现”我的意思是找到所有 (x,y) 其中 arr[x,y] = 54
标签: c++ c arrays algorithm data-structures