【问题标题】:n^2 array search algorithm [duplicate]n^2 数组搜索算法 [重复]
【发布时间】:2018-06-12 03:18:44
【问题描述】:

在有序数组中,我们可以通过二分查找在 O(logn) 中查找。 但我认为在 n*n 数组中,我们如何将这个算法(或其他算法)应用于数组以更快地搜索? n*n 列表按每一行和每一列排序,如下所示。

  1  3  7 13 19
  2  5 12 14 20
  4  9 15 16 22
  8 10 18 23 25
 11 17 21 24 27

【问题讨论】:

  • 使用分治法查找元素
  • "在已排序的数组中,我们可以通过二分搜索在 O(nlogn) 中进行搜索" -> 我认为您的意思是 O(log n)
  • 二维数组究竟是如何排序的?
  • @Henry "每一行都排序,每一列都排序"。
  • @SaiBot 对不起。你是对的。

标签: algorithm search


【解决方案1】:

显然,天真的解决方案是对每一行(或每一列)执行二进制搜索,这将导致 O (n log n) 的运行时复杂度。

我看到直接将二分搜索应用于整个矩阵的主要问题是没有完整的排序。这使得很难定义一个“拆分元素”,其中“左侧”的所有元素都较小,“右侧”的所有元素都较大。

我的直接适应方法更接近于四叉树之类的空间索引。基本观察如下:对于原始矩阵的每个子矩阵,您可以通过查看左上(下限)和右下(上限)元素来定义元素的边界。

现在您基本上可以执行深度优先搜索,递归地将矩阵拆分为 4 个子矩阵,计算每个子矩阵的上限和下限,并根据键是否在其范围内进行丢弃或探索。

【讨论】: