我和我的朋友想知道下面算法的时间复杂度是多少。我认为这是O(n),但他说这是O(n ^ 2)。我只想要第二/第三/多少意见
def sorting(seq):
T = BinarySearchTree()
for i in seq: #The insert function is part of the BST class and thus it
T.insert(i) #follows the rules for binary tree insertion.
return inorder(T) #This will return an inorder traversal of the newly
constructed tree
答案 0 :(得分:1)
正如你在评论中所说:
插入的时间复杂度最糟糕的是O(n)(插入偏斜的树中)
你为每个元素做了一次。
现在,如果你有理由相信最坏情况下的摊销复杂性低于最坏情况下的个体复杂性(例如,插入几何增长数组的末尾,最坏的情况下是O(n)
,但我们知道我们每O(n)
次只能遇到最坏的情况),事情有点复杂。但是没有理由相信这里。
因此,n
插入的总时间为n * O(n)
,显然为O(n**2)
。
由于inorder
是线性时间,因此不会添加任何内容; O(n**2 + n) == O(n**2)
。
因此,根据您已经提供和提供的信息,您的朋友是对的。
你甚至已经弄清楚如何能够遇到这种最坏的情况:最大偏斜的树意味着每个插入物最终遍历整个链条。您应该能够非常容易地生成导致这种情况的病理数据,并明确地处理小案例。您正在进行n*(n-1)/2
比较,即O(n**2)
,因此我们在分析中没有出错。