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
?
答案 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)
,尽管它在该课程的低端。