![](/img/trans.png)
[英]Create a 2D Matrix X[][] with letters on X axis and numbers on Y Axis
[英]Revisit: 2D Array Sorted Along X and Y Axis
所以,这是一个常见的面试问题。 已经有了一个话题,我已经读过,但它已经死了,没有接受任何答案。 最重要的是,我的兴趣在于一个稍微受限制的问题形式,有几个实际的应用程序。
给定二维数组,使得:
你怎么找到一个元素? 只有最坏的情况分析很重要
我知道的解决方案:
各种方法是:
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:
策略2:让我表示行索引,j表示我们已经停止的对角元素的列索引。 (这里,我们有i = j,BTW)。 设k = 1。
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
具有独特的数字大于小号X
和1
与X
。
因为它也是Omega(lg n)
(计数参数),它是Omega(m + lg n)
,其中n>=m
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.