尺寸为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
我知道蛮力方法但我试图应用更快的解决方案并将矩阵视为图形然后应用最短路径算法。我正朝着正确的方向前进?我在思考方面几乎无需帮助
编辑:有问题的提示也是
提示
•首先解决每个列的一个分区。 •然后将结果用于二维问题。
答案 0 :(得分:0)
如果您需要最有效的算法来完成此类任务,您可以进行前提条件计算:
因此在这种情况下总的渐近创建: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 :(得分:0)
首先 - 当比较从矩形坐标中获取的距离时,绝对不要比较它们,而是比较它们的方块,计算为dx ^ 2 + dy ^ 2。你不需要在sqrt上浪费时间!
显然,第二个周期是最复杂的。我会创建一个帮助表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
是矩阵的大小。)