【发布时间】:2019-11-30 22:13:22
【问题描述】:
根据Wikipedia 的说法,基于分区的选择算法(例如快速选择)的运行时间为O(n),但我并不相信。谁能解释一下为什么是O(n)?
在正常的快速排序中,运行时间是O(n log n)。每次我们将分支分成两个分支(大于pivot,小于pivot),我们需要在both分支中继续处理,而quickselect只需要处理一个强>分支。我完全理解这些观点。
但是,如果您认为在二分搜索算法中,在我们选择了中间元素之后,我们也只搜索了分支的 一个 侧。那么这是否使算法O(1)? 没有,当然,二分查找算法还是O(log N),而不是O(1)。这也与二叉搜索树中的搜索元素相同。我们只搜索one边,但我们仍然考虑O(log n)而不是O(1)。
有人可以解释为什么在快速选择中,如果我们继续在枢轴的 one 一侧进行搜索,它会被认为是 O(1) 而不是 O(log n)?我认为算法是O(n log n),O(N) 用于分区,O(log n) 用于继续查找的次数。
【问题讨论】:
-
因为
O(N) + O(log N) = O(N)。当您做某事然后再做其他事情时,您对订单进行求和,而不是相乘。 -
您链接到的维基百科页面一般是关于选择算法的,其中提到了许多算法。其中一些是 O(n) 而有些不是;你在说哪一个?另外,为什么要将快速排序算法与选择算法进行比较?它们服务于不同的目的。也许您将选择算法与selection sort 混淆了?
-
不是做某事,然后做某事。如果我理解正确的话,就是每个 O(logn) 你做 O(n) 来划分成两侧。
-
@DavidSchwartz- OP 的问题是,为什么如果您需要对分区步骤进行 O(log N) 次迭代,每个迭代都需要 O(N),那么总共不需要O(N log N)