我的函数的大型O运行时是N ^ 2还是N log N?

时间:2019-07-11 20:47:05

标签: python python-3.x big-o complexity-theory

from linkedlist import LinkedList

def find_max(linked_list): #  Complexity: O(N)
  current = linked_list.get_head_node()
  maximum = current.get_value()
  while current.get_next_node():
    current = current.get_next_node()
    val = current.get_value()
    if val > maximum:
      maximum = val
  return maximum

def sort_linked_list(linked_list):  # <----- WHAT IS THE COMPLEXITY OF THIS FUNCTION?
  print("\n---------------------------")
  print("The original linked list is:\n{0}".format(linked_list.stringify_list()))
  new_linked_list = LinkedList()

  while linked_list.head_node:
    max_value = find_max(linked_list)
    print(max_value)
    new_linked_list.insert_beginning(max_value)
    linked_list.remove_node(max_value)

  return new_linked_list

由于我们循环while循环N次,因此运行时间至少为N。对于每个循环,我们分别调用find_max,但是对于find_max的每次调用,我们要解析为find_max的链表都减少一个元素。基于此,运行时不是N log N吗?

还是N^2

3 个答案:

答案 0 :(得分:4)

仍然是O(n²);每次将大小减少1只会使n * n / 2有效工作(因为平均而言,您必须在每次通过时处理原始长度的一半,而您仍在进行n通过)。但是由于big-O表示法未包含常量因素,因此简化为O(n²)

要使其成为O(n log n),每一步都必须缩小要扫描的列表大小,而不是简单地将其缩小一个。

答案 1 :(得分:4)

它是n + n-1 + n-2 + ... + 1,它是算术序列,所以它是n(n+1)/2。因此,大写O表示为O (n^2)

答案 2 :(得分:0)

别忘了,O表示法处理最坏情况的复杂性,并描述函数的整个 class 。就O表示法而言,以下两个功能具有相同的复杂性:

64x^2 + 128x + 256           --> O(n^2)
x^2 - 2x + 1                 --> O(n^2)

在您的情况下(以及您的算法称为选择排序,在列表中选择最佳元素并将其放入新列表;其他O(n^2)排序包括插入排序冒泡排序),则具有以下复杂性:

0th iteration: n
1st iteration: n-1
2nd iteration: n-2
...
nth iteration: 1

所以整个复杂度会

n + (n-1) + (n-2) + ... + 1  =  n(n+1)/2  =  1/2n^2 + 1/2n

它仍然是O(n^2),尽管它在该课程的低端。