根据 官方题解,快速选择的做法效率最高,理想的时间复杂度相当于O(N),如下图:
我们将
f
(
N
)
f(N)
f(N)定义为任务“在长度为N的数组中,找到第k大的元素”时,所消耗的时间复杂度。
如何理解“处理的过程包括一次遍历”和“一次子分支的递归”?
1. 首先,在选取枢纽元素后,它会与数组中的每个元素做一次比较,并将其放在数组的左侧/右侧,所以总共需要“一次遍历”,记为
O
(
n
)
O(n)
O(n)。
2. 然后,当两侧元素放置完成后,只需要在某一侧重复同样的任务,记为
f
(
N
/
2
)
f(N/2)
f(N/2)
3. 两部分的时间消耗加起来,即
O
(
n
)
+
f
(
N
/
2
)
O(n)+f(N/2)
O(n)+f(N/2)。为什么不是
O
(
n
)
+
2
f
(
N
/
2
)
O(n)+2f(N/2)
O(n)+2f(N/2)呢?因为你不需要在另一侧里作重复任务。
主定理的知识可阅读主定理 大师定理 master theorem