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

如何估计使用递归Java的程序的时间和内存消耗,java,performance,recursion,memory,backtracking,Java,Performance,Recursion,Memory,Backtracking,我在解决一个问题。桌子的大小是5X5,游览的起点可以是任何正方形。我找到了所有可能的开放式解决方案,并计算了程序的内存使用量和时间消耗。我在使用递归,在每一个骑士的移动中,我都在计算一个骑士接下来可能的移动 问题是如何在一张大得多的桌子上计算内存和时间消耗。Java中通常使用什么样的工具来估计无法实际运行的程序的这些值?这应该仅仅是使用O表示法的假设吗?一般来说,没有Java工具或其他编程语言中的工具可以做到这一点。这是有关的,这是众所周知的无法解决的共同点 对于您的具体问题实例,您可以编写一个

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


问题是如何在一张大得多的桌子上计算内存和时间消耗。Java中通常使用什么样的工具来估计无法实际运行的程序的这些值?这应该仅仅是使用O表示法的假设吗?

一般来说,没有Java工具或其他编程语言中的工具可以做到这一点。这是有关的,这是众所周知的无法解决的共同点

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

例如,如果您知道,该运行时是O(2^n),这意味着

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

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

10s=c*(2^5)

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

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


但正如我所说的,为此你必须知道算法的O-符号,它来自于人类数学直觉所发现的证明,一般来说,上帝算法是不可计算的。

一般来说,没有Java工具或其他编程语言中的工具可以做到这一点。这是有关的,这是众所周知的无法解决的共同点

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

例如,如果您知道,该运行时是O(2^n),这意味着

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

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

10s=c*(2^5)

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

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


但正如我所说,为此,你必须知道算法的O-符号,它来自人类数学直觉发现的证明,通常上帝算法无法计算。

你的大得多的桌子的放大比例是多少

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

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

从一个理论观点来看,这是一个矛盾:如果你关心因子c,你也可能关心所谓的“可忽略部分”。那些在复杂度测定中退出的,是O(2^N)世界,在这个世界上唯一重要的术语是在+无穷远处支配极限的术语

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

我们面临的问题是,对于我们的消费者来说,该算法似乎没有以这种方式扩展。对于小任务,开销占主导地位。对于一个典型的评估任务,准备工作和主体的时间大致相等。对于一个真正的应用程序,主体显示了它的真实面目并接管了它,尽管前两个阶段花费的时间比评估任务的整个运行时间要长


简言之,中期计算没有按照外部观众的预期进行缩放,因为在较低的复杂度阶段具有较高的常量和系数值。

您的大得多的办公桌的缩放比例是多少

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

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

从一个理论观点来看,这是一个矛盾:如果你关心因子c,你也可能关心所谓的“可忽略部分”。那些在复杂度测定中退出的,是O(2^N)世界,在这个世界上唯一重要的术语是在+无穷远处支配极限的术语

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

我们面临的问题是,对于我们的消费者来说,该算法似乎没有以这种方式扩展。对于小任务,开销占主导地位。对于一个典型的评估任务,准备工作和主体的时间大致相等。对于一个真正的应用程序,主体显示了它的真实面目并接管了它,尽管前两个阶段花费的时间比评估任务的整个运行时间要长

简言之,中期计算并不像外部观察者所期望的那样具有可伸缩性,因为在较低的复杂度阶段具有较高的常数和系数值