什么';这段代码的时间复杂度是多少?JAVA
我想是O(3^n),有什么想法吗? 此方法查找给定的数字是否是给定集合的任何子集的和(覆盖布尔ISSMOF(int[]s,int n))。 如果标记集等于0或使用集合中的当前数字(或不使用),则该方法会在每次递归调用中进行检查,然后重试, 当目标>0且尚未耗尽阵列时什么';这段代码的时间复杂度是多少?JAVA,java,performance,recursion,sum,big-o,Java,Performance,Recursion,Sum,Big O,我想是O(3^n),有什么想法吗? 此方法查找给定的数字是否是给定集合的任何子集的和(覆盖布尔ISSMOF(int[]s,int n))。 如果标记集等于0或使用集合中的当前数字(或不使用),则该方法会在每次递归调用中进行检查,然后重试, 当目标>0且尚未耗尽阵列时 * @param set a given set of natural numbers. * @param target the number. * @param i where we are in the
* @param set a given set of natural numbers.
* @param target the number.
* @param i where we are in the set.
* @return true if we reached target, else returns false.
**/
private static boolean isSumOf(int[] set,int target,int i)
{
// Found the set if we are now at 0.
boolean isSum = (target==0);
// Look no further if no more to try.
if ( target > 0 )
{
// Look no further if we've exhausted the array.
if ( i < set.length )
{
// Try or consume this number in the set (or not) and try again.
isSum = isSumOf(set, target - set[i], i) // Consume the current number in the set and try again recursively.
|| isSumOf(set, target - set[i], i+1) // Consume the current number in the set and avdance to rhe next number.
|| isSumOf(set, target, i+1); // Try the current number and avance to the next number in the set.
}
}
return isSum;
*@param设置一组给定的自然数。
*@param以数字为目标。
*@param i我们在布景中的位置。
*@return true如果我们到达目标,否则返回false。
**/
私有静态布尔ISUMOF(int[]集,int目标,int i)
{
//如果我们现在处于0,则找到该集。
布尔ISUM=(目标==0);
//如果不再尝试,就不要再看了。
如果(目标>0)
{
//如果阵列已耗尽,请不要再查看。
如果(i
你的问题是NP完全问题。这些是坏消息
好消息是这是一个非常著名的NP完全问题
正如在评论中所说,您的算法可以无限期地运行,即使输入大小适中,也会运行很长时间
如果您对在中等大小的输入中运行该代码有任何希望,那么您需要重新考虑您的方法
您的方法中的一个大问题是,您正在计算许多重复的子问题
从好的方面来看,你的子问题有一个非常优化的结构,这是一个很好的指标,表明你的问题将是动态规划方法的一个很好的候选者。它使事情变得更容易,你甚至不需要求和值的确切数字,只需要一个布尔输出
我链接的维基百科文章讨论了一些伪多项式方法以及通过动态规划的多项式方法。它看起来比
O(3^n)
更糟糕,因为第一个递归调用isSumOf(set,target-set[I],I)
将在不推进i
的情况下调用自身,这对于大型目标将导致每个i
的大量分支
这样的方法可以从中受益,以降低其复杂性。让我们假设set只包含大于0的数字。还要注意,第二个递归调用
isSumOf(set,target-set[i],i+1)
可以省略,而不必更改结果。它相当于先减去set[i](第一个递归调用),然后推进i(第三次递归调用)。我正在讨论这个简化版本
如果n是目标,k是集合的大小,我认为复杂度是O(n^k),但我没有充分的证据。让我们假设我们正在枚举所有的可能性,并且在找到分区时不会停止(真正的算法会因为快捷方式或| |而停止)最坏的情况似乎是集合中的所有元素都是1。所以我们必须提前k次到达递归的结束,对于每一个前进的步骤i都有小于n个的可能性。你认为0是一个自然数吗?如果是的话,看起来它可以无限地运行。(小Omicron)符号存在。耶计算机科学ftw+1