【问题标题】:Determining time complexity of a function确定函数的时间复杂度
【发布时间】:2022-01-15 10:39:14
【问题描述】:

我有一个计算机科学项目,我的任务是评估这个特定函数的时间复杂度,并找出一种通过使用哈希函数数据结构(如集合和字典)来优化它的方法。

def uber_friends(group, network, current_user):        
    if  current_user not in group:                 
        group.append(current_user)
        for x in range(0, len(network)):
            if current_user in network[x]:
                ind = network[x].index(current_user)  
                if ind == 0:
                    uber_friends(group, network, network[x][1])
                if ind == 1:
                    uber_friends(group,network, network[x][0])
    else:
        return None

    return group

为了澄清,“group”最初应该是一个空列表,network 应该是一个嵌套列表,其中内部列表中的元素是 2 个 int,current_user 应该是一个 int 编辑:错字

【问题讨论】:

  • 请检查您的代码。 grumo 是错字吗?
  • 我认为问题归结为找到所有将您列为前 2 名之一的朋友。因此,在这种情况下,最佳时间复杂度将是 O(N^2),其中 N 是network 列表。假设上述算法表现最佳,那么答案应该是O(N^2)
  • 更正,如果我们还考虑if current_user in network[x]:,那么时间复杂度将是O(MN^2),其中M是每个朋友网络的最坏情况下的大小

标签: python optimization hash


【解决方案1】:

计算函数时间复杂度的第一步是使用一些示例输入运行它——然后我们可以跟踪函数并查看执行可能花费的时间。

uber_friends([], [], 1)
    uber_friends([], [], 1)
  File "test.py", line 2, in uber_friends
    if current_user not in grumo:
NameError: name 'grumo' is not defined

此异常在函数的第一行引发,无论传递什么参数都会引发。因此函数的时间复杂度为 O(1)。

我们可以将实现简化为与原始递归函数行为相同的一行:

def uber_friends(group, network, current_user):
    raise NameError("name 'grumo' is not defined")

但这不会影响时间复杂度。涉及不同数据结构的进一步优化既不可能也没有必要。

【讨论】:

  • 我认为grumo 是一个错字。但是,如果老师实际上是在寻找恒定的时间复杂度,那将是一个有趣的作业。
  • 永远不要假设 CS 作业中的任何内容都是错字——解释器/编译器肯定不会!
  • 喜欢这个分析。假设 grumo 不是错字
  • nb:我们也可以将函数体替换为单个语句grumo 并获得相同的结果,但IMO最好是优化版本更清楚地表达意图。
  • 是的,对不起,gromo 肯定是一个错字,无论如何感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多