如何估计使用递归Java的程序的时间和内存消耗

时间:2016-11-17 11:48:26

标签: java performance recursion memory backtracking

我正在解决Knight's tour问题。桌子的大小是5X5,游览的起点可以是任何方格。我找到了所有可能的开放式解决方案,并计算了内存使用情况以及程序的时间消耗。我使用递归和每个骑士'移动我计算骑士的下一个可能的动作。

问题是如何在更大的桌面上计算内存和时间消耗。 Java中通常使用哪种工具来估算不可能实际运行的程序的这些值?它应该只是假设使用O符号吗?

2 个答案:

答案 0 :(得分:1)

在General中,没有其他编程语言中的Java工具或工具可以执行此操作。它与Turing halting problem有关,已知它是不可解决的。

对于您的具体问题实例,您可以编写一个,尝试使用具体算法的理论分析(O-Notation)从较小尺寸的板上推断您的测量。

E.g。如果你知道,那个运行时是O(2 ^ n),这意味着

t = c *(2 ^ n)(+可忽略的部分)

您可以通过在等式中设置具体时间来计算常数c,例如n = 5,例如如果你为n = 5测量t = 10s:

10s = c *(2 ^ 5)

==> c = 10秒/(2 ^ 5)

这只是一个例子(我不知道你的问题是否为O(2 ^ n))。

但正如我所说,为此,你必须知道算法的O符号,它来自人类数学直觉所发现的证据,而且一般不能用神算法计算。

答案 1 :(得分:1)

更大的桌面的扩展范围是什么?

请注意,可以是计算的消耗(时间和内存)与从复杂性估计的消耗之间的显着差异。之前的答案(Thomas Philipp)是正确的,除了一个细节:

  

t = c *(2 ^ n)(+可忽略的部分)

从一个理论的角度来看,这是一个矛盾:如果你关心因素 c ,你也可能关心所谓的“可忽略的部分”。那些在复杂性决定中退出的是 O(2 ^ N)世界,其中唯一重要的术语是在+无穷大处占据极限的那个。

实际上,请检查您的设置复杂性以及算法中任何隐约的辅助术语。例如,我工作的一个程序有一个简单的 O(n ^ 2 log n)解决方案。有 O(n log n)前期工作和一些O(n)开销。

我们遇到的问题是,对于我们的消费者来说,算法没有出现来扩展。对于一项小任务,开销占主导地位。对于典型的评估任务,前期工作和主体的时间大致相等。对于一个真正的应用程序,主体显示其真实的颜色并接管,虽然前两个阶段比eval任务的整个运行时间更长。

简而言之,由于较低复杂度阶段的高常数和系数值,中期计算并未按外部观察者的预期进行扩展。