为什么此解决方案具有O(nlogn)复杂性?

时间:2019-04-06 19:17:31

标签: python bisect

给出一个整数数组,返回一个新数组,其中的每个元素 新数组是该数组右边较小元素的数量 原始输入数组中的元素。 例如,给定数组[3,4,9,6,1],返回[1,1,2,1,1,0]。

import bisect

nums = list(input().split())
nums_to_the_right = []
result = []
sorted_nums = []

for num in reversed(nums):
    index = bisect.bisect_left(sorted_nums, num)
    result.append(index)
    bisect.insort(sorted_nums, num)

result.reverse()
print(result)

此代码将打印正确的结果。 bisect_left函数应返回索引,当前元素必须对该索引进行排序。 insort函数将元素放入数组中,以使数组保持排序状态。我希望整个代码都具有O(n ^ 2)复杂性,但是据说需要O(nlogn)才能起作用。告诉我,为什么?

1 个答案:

答案 0 :(得分:0)

bisect模块使用binary search algorithm查找插入索引。使用此算法- O(logn),每次插入的复杂性(您可以通过以下链接阅读非常详细的说明)。您有 n 个元素,因此最终复杂度为 O(nlogn)。最终的result.reverse()复杂度为 O(n),因此可以在汇总复杂度计算中将其省略。