所以,这是一个常见的面试问题。已经有了一个话题,我已经读过,但它已经死了,没有接受任何答案。最重要的是,我的兴趣在于一个稍微受约束的问题形式,有几个实际应用。
给定二维数组:
你如何找到一个元素?只有最坏的案例分析很重要。
我知道的解决方案:
各种方法是:
O(nlog(n)),分别接近每一行
O(nlog(n))具有强大的最佳和平均表现。
一个是O(n + m):
从一个非极端的角落开始,我们假设它是右下角
让目标是J. Cur Pos是M.
如果M大于J,则向左移动
如果M小于J,则向上移动。
如果你不能做到,你就完成了,J就不存在了
如果M等于J,那么你就完成了
最初在其他地方找到,最近从here被盗。
而且我相信我见过一个最坏情况下的O(n + m),但最近的情况是接近O(log(n))。
我很好奇:
现在,我已经证明了我的满意,天真的分区攻击总是转向nlog(n)。一般来说,分区攻击似乎具有O(n + m)的最佳最坏情况,并且大多数情况不会在缺席的情况下提前终止。因此,我也想知道,如果插值探测器可能不比二进制探测器更好,那么我可能会认为这是一个集合之间弱相互作用的集合交叉问题。我的思绪立即转向Baeza-Yates intersection,但我没有时间起草这种方法的改编。然而,考虑到我怀疑O(N + M)最坏情况的最优性是可证明的,我想我会继续问这里,看看是否有人可以将反驳论证捆绑在一起,或者将复发关系拉到一起用于插值搜索。
答案 0 :(得分:0)
这是一个必须至少Omega(min(n,m))
的证明。让n >= m
。然后考虑所有0
s (i,j)
位于i+j < m
的矩阵,所有2
s位于i+j >= m
,除了(i,j)
个i+j = m
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
位于{{1}}。
答案 1 :(得分:0)
最佳O(m + n)解决方案是从左上角开始,具有最小值。向右对角线向右移动,直到您点击其值> gt =给定元素的值的元素。如果元素的值等于给定元素的值,则返回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