O(nlogn)运行时方法

时间:2015-03-17 02:22:31

标签: python python-3.x

该函数使用int列表并按递增顺序生成列表中的唯一元素。例如:

    singles([4,1,4,17,1]) => [1,4,17]

我只能在O(n ^ 2)运行时间内完成它,并想知道如何在没有循环的情况下更改为O(n)运行时间。

      def singles(lst):
        if lst==[]: return []
        else:
        rest_fn = list (filter (lambda x: x!=lst[0], lst[1:]))
        return [lst[0]] + singles(rest_fn)

1 个答案:

答案 0 :(得分:2)

如上所述,每https://wiki.python.org/moin/TimeComplexity(从Time complexity of python set operations?引用,它也链接到更详细的操作列表,已排序应具有时间复杂度O(nlogn)。设置应具有时间复杂度O (n)。因此,做sorted(set(input))应该有时间复杂度O(n)+ O(nlogn)= O(nlogn)

编辑: 如果你不能使用set,你应该提一下,但作为一个提示,假设你可以使用sorted,你仍然可以在O(n)中取出uniques如果你使用deque(其中O(1)最差案件插入)。像

这样的东西
rez = deque()
last = None
for val in sorted(input):
   if val != last:
      rez.add(val) # or whatever deque uses to add to the end of the list
      last = val