我们有以下伪代码来查找数组中k
个最小的数字。
partition(A, begin, end)
x = A[end]
i = begin – 1
for j = begin to end – 1
if A[j] <= x
i = i + 1
swap(A[i], A[j])
swap(A[i + 1], A[end])
return i + 1
select(A, begin, end, k)
m = partition(A, begin, end)
s1 = m – begin
s2 = end – m
s = s1 + s2 + 1
if s1 >= k
return select(A, begin, m – 1, k)
else if s – s2 == k
return m
else
return select(A, m + 1, end, k – s + s2)
swap()
函数只是通过引用方式在参数中交换它的参数,并且它需要恒定的时间。对于长度为n
的数组,big-O表示法中最坏情况的复杂性可能是什么?
答案 0 :(得分:0)
Big O符号很简单,因为它可以根据最坏的情况为您提供复杂性的一般概念。
当您对事物进行分区时,通常意味着您有一个O log(n),当您查看它意味着您有O n时,当您有嵌套循环时,您将有O n ^ x,其中x是金额嵌套循环,2个循环意味着O n ^ 2,三个循环意味着O n ^ 3,依此类推。检查您的伪代码中的案例,您将得到答案。
我可能是错的,但我发现在最糟糕的情况下,你正在循环你的A的所有元素并对所有元素进行分区,因为它们都是相反的,这意味着O nlog(n)可以简单地作为O LOG(n)中。
为了更好地理解algorythms,我推荐这个Standford course
希望这有帮助。