【发布时间】:2015-03-10 20:35:15
【问题描述】:
我们有以下伪代码来查找数组中的kth 最小数。
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 表示法中最坏情况下的复杂度可能是多少?
【问题讨论】:
-
看起来像家庭作业。回答不会有帮助。并且需要猜测,因为这不是我所知道的编程语言。
-
到目前为止你的分析是什么?
-
提示:每个
select()直接执行一个partition()。一些select()s 递归。partition()的最坏情况成本是多少,可以达到的最大递归深度是多少? -
在最坏的情况下,select 可以递归到大端(大减端)然后它停止。在这种情况下,每个选择都会进行分区。我可以错吗?我认为最大深度是 N。
标签: performance algorithm big-o