递归方法最长路径算法的计算复杂度

2023-11-27

我编写了一个代码段来确定图中的最长路径。以下是代码。但由于中间的递归方法,我不知道如何获得其中的计算复杂度。由于找到最长的路径是一个 NP 完全问题,我认为它是这样的O(n!) or O(2^n),但我怎样才能真正确定它呢?

public static int longestPath(int A) {
    int k;
    int dist2=0;
    int max=0;

    visited[A] = true;

    for (k = 1; k <= V; ++k) {
        if(!visited[k]){
            dist2= length[A][k]+longestPath(k);
            if(dist2>max){
                max=dist2;
            }
        }
    }
    visited[A]=false;
    return(max);
}

你的递归关系是T(n, m) = mT(n, m-1) + O(n), where n表示节点数,m表示未访问节点的数量(因为您调用longestPath m次,并且有一个循环执行访问的测试n次)。基本情况是T(n, 0) = O(n)(只是访问过的测试)。

解决这个问题,我相信你会得到 T(n, n) 是 O(n * n!)。

EDIT

Working:

T(n, n) = nT(n, n-1) + O(n) 
        = n((n-1)T(n, n-2) + O(n)) + O(n) = ...
        = n(n-1)...1T(n, 0) + O(n)(1 + n + n(n-1) + ... + n(n-1)...2)
        = O(n)(1 + n + n(n-1) + ... + n!)
        = O(n)O(n!) (see http://oeis.org/A000522)
        = O(n*n!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归方法最长路径算法的计算复杂度 的相关文章

  • Clojure:只能从尾部位置重复

    我正在尝试递归地反转列表 但是我得到了Can only recur from tail position运行时 这到底意味着什么 如何改进我的代码才能使其正常工作 defn recursive reverse coll loop coll
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • PHP递归遍历对象树[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java 递归和性能

    递归对处理器和内存的影响是否很大 我的意思是 我的一个线程有一个方法 很可能会调用自身 假设它每秒可以自调用一次 我的应用程序应该运行至少 24 小时而不停止 因此它提供了 60 60 24 86400 个自调用方法 它对第二个 主 线程有
  • 卷积函数可以写成尾递归形式吗?

    我有一个函数 我想以尾递归形式编写 该函数计算求和的方法数k通过滚动s双面模具n次 我已经在上面看到了这个函数的数学解这个答案 https math stackexchange com questions 397689 why convol
  • 如何高效生成总和在指定范围内的所有组合(在所有深度)

    假设您有一组值 1 1 1 12 12 16 如何生成总和在预定义范围内的所有可能组合 不重复 min max 例如 这里是 所有深度的 范围在13 and 17 1 12 1 1 12 1 1 1 12 16 1 16 这假设具有相同值的
  • duckmap 到底有什么作用?

    From 文档 https docs perl6 org routine duckmap duckmap将会应用 block每个元素上并返回一个新列表 其中包含块的已定义返回值 对于未定义的返回值 duckmap如果该元素实现了 将尝试下降
  • 求一根棒可以切割的最大片数

    这是完整的问题陈述 给定一根长度为n的绳子 你需要找到最大的绳子数你可以让每一段的长度都在集合 a b c 中给定三个值a b c 我知道可以通过动态规划来实现最优解 但是 我还没有学过这个主题 我需要递归地解决这个问题 对于递归 主要的事
  • Java 中具有级别顺序插入的完整二叉搜索树

    我们接到一个任务 需要编码 二叉搜索树 那个树has to be complete not perfect 这意味着所有不在最低级别或次低级别的节点都应该有 2 个子节点 而最低级别的节点应尽可能远离左侧 我们需要插入到树中等级顺序 所以如
  • 从数据库结果生成多维数组的递归函数

    我正在编写一个函数 它接受页面 类别数组 来自平面数据库结果 并根据父 ID 生成嵌套页面 类别项目数组 我想递归地执行此操作 以便可以完成任何级别的嵌套 例如 我在一个查询中获取所有页面 这就是数据库表的样子 id parent id t
  • typescript 类型最大递归限制为 9

    我终于成功创建了一个通用类型 它为我提供了 json 键列表 值的所有可能组合 我什至准备了一种限制递归的方法 type EditAction
  • 生成一定长度的所有排列

    假设我们有一个字母表 abcdefghiklimnop 如何以有效的方式以五个一组的形式重复该字母表来递归生成排列 几天来我一直在为此苦苦挣扎 任何反馈都会有帮助 本质上这与 生成给定字符串的所有排列 https stackoverflow
  • 添加到 SortedSet 及其复杂性

    MSDN 声明如下SortedSet T Add 方法 http msdn microsoft com en us library dd411709 28VS 100 29 aspx 如果 Count 小于内部数组的容量 则此方法的操作时间
  • 为什么 GHC 在这里推断出单态类型,即使禁用了单态限制?

    这是由解析 f f pure 的类型 https stackoverflow com questions 55388119 resolving the type of f f pure 55388309 noredirect 1 comme
  • 将所有奇数位置的元素移动到左半部分,将偶数位置的元素移动到右半部分

    给定一个包含正整数和负整数的数组 将所有奇数索引元素移动到左侧 将偶数索引元素移动到右侧 问题的难点是在维持秩序的同时就地做 e g 7 5 6 3 8 4 2 1 输出应该是 5 3 4 1 7 6 8 2 如果顺序不重要 我们可以使用快
  • Lisp 中的十进制到二进制 - 制作非嵌套列表

    当达到我的递归情况时 我使用list将未来结果附加到当前结果 但由于递归 我最终得到一个嵌套列表 当我有一个导致递归超过五次的数字时 这会导致错误 任何想法如何我可以在一个简单的非嵌套列表中获得结果 例如 CL 用户 100 8 gt BI
  • 如何在 Alloy 中构建递归谓词/函数

    我试图在 Alloy 中生成两组类 例如重构之前的类 重构应用程序后的应用程序和类 假设在第一组中我们有以下类 ALeft gt BLeft gt CLeft Class1 Class2 gt Class3 gt Class4 这意味着 A
  • 将括号子集映射到字符

    我正在尝试创建一个 Scala 方法 该方法将采用一个父括号组 表示为字符串 然后将每个括号子组映射到不同的字母 然后它应该将它们放入它返回的映射中 所以基本上我调用以下方法 如下所示 val s 2 x 3 6 val map mapPa
  • lambda 函数可以递归吗? [复制]

    这个问题在这里已经有答案了 可能的重复 C 0x 中的递归 lambda 函数 https stackoverflow com questions 2067988 recursive lambda functions in c0x 这是一个
  • while循环内的递归,它是如何工作的?

    你能告诉我这段java代码是如何工作的吗 public class Main public static void main String args Strangemethod 5 public static void Strangemet

随机推荐