Hello StackOverflow社区!
这么多天我脑子里都有这个问题,最后决定把它整理好。那么,给定一个算法或说一个在日常编码活动中实现一些非标准算法的函数,你如何分析朗姆酒的时间复杂度呢?
好的,让我更具体一点。假设你正在解决这个问题,
给定由正整数组成的NxN矩阵,找到其中最长的序列。您只能在向上,向下,向左或向右的方向上移动,而不能在对角线上移动。
例如:如果矩阵是
[ [9,9,4],
[6,6,8],
[2,1,1] ].
算法必须返回4
(序列为1-> 2-> 6-> 9)
所以是的,看起来我必须使用DFS。我得到这个部分。我已经在Uni完成了我的算法课程,可以解决这些问题。所以,我想出了这个解决方案,
class Solution
{
public int longestIncreasingPathStarting(int[][] matrix, int i, int j)
{
int localMax = 1;
int[][] offsets = {{0,1}, {0,-1}, {1,0}, {-1,0}};
for (int[] offset: offsets)
{
int x = i + offset[0];
int y = j + offset[1];
if (x < 0 || x >= matrix.length || y < 0 || y >= matrix[i].length || matrix[x][y] <= matrix[i][j])
continue;
localMax = Math.max(localMax, 1+longestIncreasingPathStarting(matrix, x, y));
}
return localMax;
}
public int longestIncreasingPath(int[][] matrix)
{
if (matrix.length == 0)
return 0;
int maxLen = 0;
for (int i = 0; i < matrix.length; ++i)
{
for (int j = 0; j < matrix[i].length; ++j)
{
maxLen = Math.max(maxLen, longestIncreasingPathStarting(matrix, i, j));
}
}
return maxLen;
}
}
效率低,我知道,但我是故意这样写的!无论如何我的问题是,你如何分析 longestIncreasingPath(矩阵)函数的运行时间?
我可以理解他们在Algos课程中教给我们的分析,你知道标准的MergeSort,QuickSort分析等等但不幸的是我不想这样说,不准备我应用它在我的日常编码工作中。我现在想做,因此想通过分析这些功能来启动它。
有人可以帮助我,并描述分析上述功能的运行时所需的步骤吗?这对我很有帮助。提前谢谢,干杯!
答案 0 :(得分:2)
对于日常工作来说,通过眼球的事情通常很有效。 在这种情况下,您将尝试递归地向各个方向前进。所以我想到一个非常糟糕的例子:[[1,2,3],[2,3,4],[3,4,5]]这样你就可以从大多数细胞中选择两种方法。我碰巧知道这将是O((2 * n)!/(n!* n!))步骤,但另一个好的猜测是O(2 ^ N)。现在你已经有了一个你知道或者可以更容易地计算复杂性的例子,整体复杂性必须至少是这样。
通常情况下,确切的问题并不重要,因为对于O(N!)和O(2 ^ N),运行时间变得非常快,并且应该只能在10左右快速工作如果你愿意等,可能会多一点。你不会为N~ = 1000运行这个算法,你需要一些多项式。所以粗略估计你有一个指数解决方案就足以做出决定。
因此,为了了解复杂性,请尝试将您的解决方案与已知复杂性的其他算法相关联,或者找出算法的最坏情况,以便更容易判断复杂性。即使你稍微偏离它,它仍然可以帮助你做出决定。
如果您需要比较更复杂的算法(即O(NlogN)与O(N ^ 2)的N~ = 100),您应该实现两者和基准,因为常数因子可能是该因素的主要贡献因素。运行时间。