Algorithm 处理输出时的时间复杂度

Algorithm 处理输出时的时间复杂度,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,我正在努力找出这段代码的时间复杂度 def under_ten(input_list : List[int]) -> List[int]: res = [] for i in input_list: if i < 10: res.append(i) res.sort() return res def在_-ten下(输入_-list:list[int])->list[int]: res=[] 对于输入列表中的i

我正在努力找出这段代码的时间复杂度

def under_ten(input_list : List[int]) -> List[int]:
    res = []
    for i in input_list:
        if i < 10:
            res.append(i)

    res.sort()
    return res
def在_-ten下(输入_-list:list[int])->list[int]:
res=[]
对于输入列表中的i:
如果i<10:
第(i)项决议
res.sort()
返回res
由于循环迭代n的每个元素,我认为最好的情况应该是
O(n)
。我不确定的是结果列表的排序如何影响整个函数的时间复杂度。最坏的情况是
O(nlogn)
(n中的所有数字都小于10,因此结果列表与输入列表的大小相同)?那么平均的情况是什么呢


编辑:将输入名称从n更改为input_list,并添加了类型提示,如果这造成了一些混乱(也添加了类型提示),很抱歉。

您的第一个观察结果是正确的,即迭代输入集合将是一个
O(n)
操作,其中
n
这里是名为
n
的数组的长度。最后排序操作的运行时间取决于
res
数组的大小。在最坏的情况下,
n
中的每个数字都将小于10,因此将以
res
结束。Python用于
sort()的内部算法可能是quicksort或mergesort(q.v.)。这两种算法都使用了一种分而治之的方法,在
O(N*lgN)
中运行。因此,在最坏的情况下,您的
under_ten()
函数将在
O(N*lgN)
中运行。您的第一个观察结果是正确的,即迭代输入集合将是一个
O(N)
操作,其中
N
这里是名为
N
的数组的长度。最后排序操作的运行时间取决于
res
数组的大小。在最坏的情况下,
n
中的每个数字都将小于10,因此将以
res
结束。Python用于
sort()的内部算法可能是quicksort或mergesort(q.v.)。这两种算法都使用了一种分而治之的方法,在
O(N*lgN)
中运行。因此,在最坏的情况下,您的
under_ten()
函数将在
O(N*lgN)
中运行,让N为列表的长度,K为小于10的元素数

复杂度为O(N+K logk),假设追加是在摊销的固定时间内完成的


在最坏的情况下,K=N,因此O(N logn),前提是排序确实具有最坏的情况O(N logn)。否则,它可能是O(N²)。

设N为列表的长度,K为小于10的元素数

复杂度为O(N+K logk),假设追加是在摊销的固定时间内完成的


在最坏的情况下,K=N,因此O(N logn),前提是排序确实具有最坏的情况O(N logn)。否则,它可能是O(N²)。

您使用哪种排序算法?如果
N
是一个列表,您不应该编写
O(N)
。用简单的计数排序替换对
sort
的调用,您将得到
O(input\u list.length)
最坏情况下的复杂性。顺便说一句,你不清楚你在
O(n)
中所说的
n
是什么意思,因为你还没有定义
n
。你使用哪种排序算法?如果
n
是一个列表,你就不应该写
O(n)
。用简单的计数排序替换对
sort
的调用,你就会得到
O(input\u list.length)
最坏情况的复杂性。顺便说一句,你不清楚你在
O(n)
中所说的
n
是什么意思,因为你还没有定义
n
。OP用奇怪的变量名欺骗了你。n是迭代器或容器。时间复杂度取决于N=len(N),但由于排序的原因,时间复杂度当然是O(N logn)。我要注意的是,这个函数可以通过在res前加前缀以O(N*N)的形式重新写入,也可以使用非基于比较的排序以O(N)的形式重新写入,由于值的范围有限。众所周知,无论pivot selection strategy.OP用奇怪的变量名欺骗了您,快速排序的行为都是O(N²)。n是迭代器或容器。时间复杂度取决于N=len(N),但由于排序的原因,时间复杂度当然是O(N logn)。我要注意的是,这个函数可以通过在res前加前缀以O(N*N)的形式重新写入,也可以使用非基于比较的排序以O(N)的形式重新写入,由于值的范围有限,无论轴选择策略如何,快速排序的行为都是O(N²)。排序不是在10个元素上完成的。它是在只包含少于10个元素的数组上完成的。@TimBiegeleisen:ouch,n是一个列表!对不起,排序不是在10个元素上完成的。它是在只包含少于10个元素的数组上完成的。@TimBiegeleisen:ouch,n是一个列表!很抱歉