**大家好, 我有一个关于递归关系/大O符号的问题。我接到了一份家庭作业,要求我给出我以前的家庭作业所提出的一些旧代码/算法的Big O符号。可悲的是,我还没有参加有限数学课程;所以这对我来说是新的。我设法找出了我使用的四种算法中的三种。但是,我坚持第四种算法。此方法是递归方法,并使用Java编码。我真的花了好几个小时试图解决这个问题,而且我看了很多视频并阅读了大量有关Big 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。
答案 0 :(得分:0)
如果我正确理解你的代码,那么这不是传统的重复,因为n(输入大小)会在每次递归调用时发生变化,但不一定会变小,即它不是分而治之的算法。
本声明
for(FacebookUser hold : e.getFriends()){
if( !hold.equals(rootUser) && addHash(hold)){
getRecommendations(hold);
}
}
为未指定数量的朋友调用getRecommendations(),然后为每个朋友的朋友调用它。对我而言,如果您将其视为图形问题,似乎会为网络中的每个朋友或每个节点调用此方法。这意味着我的运行时间为O(k),其中k =初始用户可通过任意数量的边缘到达的唯一节点数。