矩阵中最接近的非零元素

时间:2015-04-21 14:04:48

标签: algorithm graph shortest-path

尺寸为n * n的矩阵仅包含零和1作为元素。编写伪代码,为每个复杂度最低的元素找到最接近的非零元素。

•距离是欧几里德

输入矩阵

0 0 0

0 0 0

0 0 1

输出

Sqrt(8)sqrt(5)2

Sqrt(5)sqrt(2)1

2 1 0

我知道蛮力方法但我试图应用更快的解决方案并将矩阵视为图形然后应用最短路径算法。我正朝着正确的方向前进?我在思考方面几乎无需帮助

编辑:有问题的提示也是

提示

•首先解决每个列的一个分区。 •然后将结果用于二维问题。

3 个答案:

答案 0 :(得分:0)

如果您需要最有效的算法来完成此类任务,您可以进行前提条件计算:

  1. 读取矩阵(O(n * n))
  2. 查找最靠近左边的每个单元格1(O(n * n))存储在数组A中
  3. 查找最靠近右边的每个单元格1(O(n * n))store int array B
  4. 当你选择元素(例如dist(2,3))时,从A&& B阵列(例如min(A [2] [3],B [2] [3]));
  5. 因此在这种情况下总的渐近创建:O(3 * N * N),内存:3 * N * N 但是对于访问,您将把它减少到O(1)

    P.S。用于初始化的资源可以减少到O(N)mem:N和组合步骤(例如,第一步和第二步的简单组合),但是你自己做:)

    P.P.S。 我有点太苛刻,并没有想到距离在欧几里德。在这种情况下,你可以像我之前建议的那样做。但是这种初始化的渐近将是O(N N N),但你可以将它改进为O(N N log(N)),并使用像bfs这样的图形:

    1. 输入矩阵
    2. 创建额外的数组dist并用inf填充(smth如1 * 1000 * 1000)
    3. 通过它找到1
    4. 在主要方向开始bfs
    5. 存储在dist数组中,最小值来自旧值和新计算(dist [i] [j] = min(dist [i] [j],calc_dist(i,j,i_1,j_1))
    6. 这个算法也可以改进一点;

      因此,减少访问访问时间的主要思想是预先计算并在可能的情况下存储它们。

答案 1 :(得分:0)

首先 - 当比较从矩形坐标中获取的距离时,绝对不要比较它们,而是比较它们的方块,计算为dx ^ 2 + dy ^ 2。你不需要在sqrt上浪费时间!

  • 因此,检查{0,1,2,...的距离SD的平方,(最远的 角)}。对于每一个:
  • 在内循环中寻找所有dx> 0& dy> 0,例如dx ^ 2 + dy ^ 2 = SD。
  • 在最里面的循环中,组合 - + dx,dy的符号。
  • 将dx和dy添加到源坐标。
  • 检查结果单元格是否在矩阵内
  • 检查结果单元格的内容是否为0。

显然,第二个周期是最复杂的。我会创建一个帮助表f(a,b)= a ^ 2 + b ^ 2并在其中查找SD,使用该表是单调的。

因此,对于大距离,复杂度将为O(n ^ 2),并且该算法也适用于最近距离。

答案 2 :(得分:0)

我相信你所寻找的东西被称为给定矩阵的欧几里德距离变换。在http://cs.brown.edu/~pff/dt/有一篇论文和一个实现(计算图像的欧几里德距离变换)。他们声称算法的渐近运行时间为O(dN),其中d是维度(在您的情况下为d=2),N是点数(N = n^2在你的情况下,n是矩阵的大小。)