我必须确定给定计数排序代码的时间复杂度。我知道计数排序应该是O(n + k),但是我看不到这个函数是O(n + k),因为第二个for循环中有一个for循环。
def counting_sort(array, k): # k is max(array)
count = (k+1) * [0]
sorted = []
for i in array:
count[i] += 1
for i in range(len(count)):
if count[i] != 0:
sorted += [i for j in range(count[i])]
return sorted
如果元素是唯一的,最坏的情况不是n + k ^ 2吗?
答案 0 :(得分:2)
第一个循环
for i in array:
count[i] += 1
进行n次迭代,第二个循环中的指令数 对于列表理解,在最坏的情况下执行:
i for j in range(count[i]) #
为count[i]
,并且所有count[i]
的总和等于n。
请注意,比较
if count[i] != 0:
完成k次,在最坏的情况下
sorted +=...
也做了k次。将所有这些加在一起,就可以得到O(n + k)
(假设sorted
的+ =是常数成本,否则我们必须说+ =是摊销常数,因此结果带有警告性。)