【问题标题】:Figuring out The Big O Notation/Recurrence Relation From My Old Algorithm从我的旧算法中找出大 O 表示法/递归关系
【发布时间】:2015-03-19 20:09:22
【问题描述】:

**大家好, 我有一个关于递归关系/大 O 表示法的问题。我得到了一个家庭作业,要求我给出一些旧代码/算法的大 O 表示法,这些代码/算法是我为之前的家庭作业提出的。可悲的是,我还没有上过有限数学的课程。所以这对我来说是新的。我设法找出了我使用的四种算法中的三种。但是,我被困在第四种算法上。此方法是一种递归方法,并且是用 Java 编码的。我确实花了好几个小时试图弄清楚这一点,我看过很多视频并阅读了很多关于大 O 表示法的文章,但遗憾的是无法理解。任何帮助都会很棒!!! 这是代码:

ArrayList<FacebookUser> getRecommendations(FacebookUser e) {
    FacebookUser rootUser = userCallForList.get(0);


    if(rootUser.getFriends().isEmpty() || e.getFriends().isEmpty()){
        return returnHash();
    }

    for(FacebookUser hold : e.getFriends()){
        if( !hold.equals(rootUser) && addHash(hold)){
            getRecommendations(hold);   
        }
    }

    return returnHash();
}

关于代码的注意事项: 该方法将 FacebookUser 作为参数。该方法返回一个 ArrayList,其中包含传递给它的 FacebookUser 的所有朋友以及对该 FacebookUser 的所有朋友调用相同 getRecommendations 方法的结果。如果他们已经在推荐列表中,它不会将任何人添加到推荐列表中,并且不会添加调用它的 FacebookUser (E.I rootUser);因为这可能导致无限循环。我使用 HashSet 作为我的集合,然后我必须将其更改回 ArrayList。

【问题讨论】:

    标签: java recursion big-o recurrence


    【解决方案1】:

    如果我正确理解您的代码,那么这不是传统的递归,因为 n(输入大小)在每次递归调用时都会发生变化,但不一定会变小,即它不是分而治之的算法。

    此声明

    for(FacebookUser hold : e.getFriends()){
            if( !hold.equals(rootUser) && addHash(hold)){
                getRecommendations(hold);   
            }
        }
    

    为未指定数量的朋友调用 getRecommendations(),然后为每个朋友的朋友调用它。对我来说,如果您将其视为图形问题,似乎会​​为网络中的每个朋友或每个节点调用此方法。这对我来说意味着运行时间 O(k),其中 k = 初始用户可通过任意数量的边到达的唯一节点数。

    【讨论】:

    • 非常感谢您抽出宝贵时间回复我的帖子;我也同意这不是分而治之的算法。我现在在想的是,大 O 表示法是 O(N+M),因为两个数据集(FacebookUser 的数量和朋友的数量)结合起来决定了性能。在使用不同数量的 FacebookUser 运行此代码之后,每个人都有不同数量的朋友。我发现时间复杂度取决于两个因素:递归调用中涉及的 FacebookUser 数量和每个 FacebookUsers 好友列表的大小。
    • 我认为它比 O(k) 更糟糕,因为returnHash() 在每次调用时都会从哈希集转换为数组列表。根据转换的具体方式,您可能会说 O(k^2)。
    • 转换是通过 for each 循环完成的,我认为它是在每次返回时完成的。 public ArrayList&lt;FacebookUser&gt; returnHash() { ArrayList&lt;FacebookUser&gt; returnList = new ArrayList&lt;FacebookUser&gt;(); for (FacebookUser hold : glo) { returnList.add(hold); } return returnList; }
    • 现在考虑到 returnHash() 似乎需要 n 时间。我认为时间会是 O(n + m^2) 其中 n = 是 FacebookUsers 的初始数量,m 是朋友/用户的平均数量?
    • 不确定m 是朋友/用户的平均数量。例如,如果 a, b, c, and d 是 FacebookUser 并且 --&gt; 表示他们是朋友。 a --&gt; b b --&gt; c c --&gt; d c --&gt; b c--&gt; a d --&gt; a d --&gt; b 递归方法中涉及的 FacebookUser 数量为 4,所有好友的总大小为 7。如果 n 是所涉及的 FacebookUser 数量,m 是所有好友的总大小。但是,如果我们这样做 O(n+m^2) 总时间复杂度将只有 (4+1.75^2) = 7.0625 这没有意义。对不起,电话拼写错误..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多