时间复杂度减半数组

Time complexity halving an array

将数组一分为二并找到最小元素的时间复杂度是多少?

是 O(n) 还是 O(log n)?

将一个(未排序的)数组分成 2 个已排序分区的复杂度为 O(NlogN)

一旦您有两个已排序的分区,就可以 O(1) 找到其中一个...中的最小元素,因此找到两个分区中的最小元素。

(已排序分区的最小元素是第一个。)

分区数组的时间复杂度

如果数组 A 已经被划分为两个排序分区 P1 和 P2,其中 P1 沿着 A 0 <= i < k 的索引分布,P2 沿着索引 k <= i < n 分布,k 是其中的任意索引范围 0 <= k < n.

然后,你知道两个分区的最小元素是它们的第一个。访问两个分区的第一个元素的时间复杂度为 O(1),比较检索到的两个最小值的时间复杂度再次为 O(1).

因此,在分为两个已排序分区的数组中查找最小值的总体复杂度为 O(1)

数组到分区的时间复杂度

相反,如果给定的数组 A 必须在两个已排序的分区中排序(因为这是一项要求),那么您需要找到它的最小元素。然后你需要将你的数组分成两个具有任意索引 k 的分区,用最有效的排序算法对这两个分区进行排序,该算法具有复杂度 O(n log n),然后应用上面公开的相同逻辑来查找最小元素。

对于任何给定的 k 值,k 0 <= k < n,我们将不得不应用排序算法两次(在两个分区上)。但是,由于Complexity Computation的additive 属性表示两个相同阶的复杂度相加仍然等于相同的复杂度,那么例如对于k = n/2 我们会得到:O(n/2 log n/2) + O(n/2 log n/2) 仍然会产生 O(n log n)。更普遍的是 O(k log k) + O((n-k) log (n-k))0 <= k < nn => ∞,由于常数因子 属性,这仍然会给我们 O(n log n)。最后,我们需要考虑到这种复杂性,即在两个分区中找到最小元素的恒定复杂性 O(1),这仍然会给我们 O(n log n).

综上所述,将数组 A 划分为两个分区 P1 和 P2 并找到最小元素的总体复杂度为 O(n log n)