繁体   English   中英

重温:沿X轴和Y轴排序的2D阵列

[英]Revisit: 2D Array Sorted Along X and Y Axis

所以,这是一个常见的面试问题。 已经有了一个话题,我已经读过,但它已经死了,没有接受任何答案。 最重要的是,我的兴趣在于一个稍微受限制的问题形式,有几个实际的应用程序。

给定二维数组,使得:

  • 元素是独一无二的
  • 元素沿x轴和y轴排序。
  • 两种类型都不占优势,因此两种类型都不是二级排序参数。
  • 结果,对角线也被分类。
  • 所有这些都可以被认为是朝着同一个方向发展。 也就是说,他们都是提升,或者他们都在下降。
  • 从技术上讲,我认为只要你有一个> / = / <比较器,任何总排序都应该有效。
  • 元素是数字类型,带有单周期比较器。
  • 因此,内存操作是大O分析的主要因素。

你怎么找到一个元素? 只有最坏的情况分析很重要

我知道的解决方案:
各种方法是:
O(nlog(n)),分别接近每一行。
O(nlog(n))具有强大的最佳和平均表现。

一个是O(n + m):
从一个非极端角落开始,我们假设它是右下角。
让目标是J. Cur Pos是M.
如果M大于J,则向左移动。
如果M小于J,则向上移动。
如果你不能做到,你就完成了,J不在场。
如果M等于J,那么你就完成了。
最初在其他地方找到,最近从这里被盗。

而且我相信我已经看到一个最坏情况下的O(n + m),但最近的情况是接近O(log(n))。

我很好奇:

现在,我已经证明了我的满意,天真的分区攻击总是转向nlog(n)。 一般来说,分区攻击似乎具有O(n + m)的最佳最坏情况,并且大多数情况不会在缺席的情况下提前终止。 因此,我也想知道,如果插值探测器可能不比二进制探测器更好,那么我可能会认为这是一个集合之间弱相互作用的集合交叉问题。 我的思绪立即转向Baeza-Yates十字路口 ,但我没有时间起草这种方法的改编。 然而,考虑到我怀疑O(N + M)最坏情况的最优性是可证明的,我想我会继续问这里,看看是否有人可以将反驳论证捆绑在一起,或者将复发关系拉到一起用于插值搜索。

最佳O(m + n)解决方案是从左上角开始,具有最小值。 沿对角线向下向右移动,直到您点击一个值> =给定元素值的元素。 如果元素的值等于给定元素的值,则返回find为true。

否则,从这里我们可以以两种方式进行。

策略1:

  1. 在列中向上移动并搜索给定元素,直到我们到达结尾。 如果找到,则返回发现为真
  2. 在行中向左移动并搜索给定元素,直到我们到达结尾。 如果找到,则返回发现为真
  3. 返回发现为false

策略2:让我表示行索引,j表示我们已经停止的对角元素的列索引。 (这里,我们有i = j,BTW)。 设k = 1。

  • 重复以下步骤,直到ik> = 0
    1. 搜索[ik] [j]是否等于给定元素。 如果是,返回发现为真。
    2. 搜索a [i] [jk]是否等于给定元素。 如果是,返回发现为真。
    3. 增量k

1 2 4 5 6
2 3 5 7 8
4 6 8 9 10
5 8 9 10 11

这是一个证据,它必须至少是Omega(min(n,m)) n >= m 然后考虑在(i,j)处具有全0的矩阵,其中i+j < m ,所有2 s,其中i+j >= m ,除了具有i+j = m的单个(i,j) 1 这是一个有效输入矩阵,并有m为可能的放置1 没有查询到阵列(比的实际位置其他1 )可以区分在那些m可能的放置。 因此,您必须检查最坏情况下的所有m位置,以及任何随机算法的至少m/2预期位置。

你的一个假设是矩阵元素必须是唯一的,我没有这样做。 这是很容易解决,但是,因为你随便挑一个大数目X=n*m ,更换所有0独特的数字少于一X ,所有2具有独特的数字大于小号X1X

因为它也是Omega(lg n) (计数参数),它是Omega(m + lg n) ,其中n>=m

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM