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

时间:2010-12-20 23:29:46

标签: algorithm multidimensional-array set linear-algebra

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

给定二维数组:

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

你如何找到一个元素?只有最坏的案例分析很重要。

我知道的解决方案:
各种方法是:
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)最坏情况的最优性是可证明的,我想我会继续问这里,看看是否有人可以将反驳论证捆绑在一起,或者将复发关系拉到一起用于插值搜索。

2 个答案:

答案 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。这是一个有效的输入矩阵,11个可能的展示位置。没有查询数组(m的实际位置除外)可以区分m个可能的展示位置。因此,您必须检查最差情况下的所有m/2位置,以及任何随机算法的至少X=n*m个预期位置。

您的一个假设是矩阵元素必须是唯一的,我没有这样做。但是,很容易修复,因为您只需选择一个大数字0,将所有X替换为小于2的唯一数字,所有X都包含唯一数字大于1X大于Omega(lg n)

因为它也是Omega(m + lg n)(计算参数),n>=m位于{{1}}。

答案 1 :(得分:0)

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

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

策略1:

  1. 在列中向上移动并搜索给定元素,直到我们到达结尾。如果找到,则返回发现为真
  2. 在行中向左移动并搜索给定元素,直到我们到达结尾。如果找到,则返回发现为真
  3. 返回发现为假
  4. 策略2: 让我表示行索引,j表示我们已经停止的对角元素的列索引。 (这里,我们有i = j,BTW)。设k = 1。

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

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