Algorithm 中值算法:为什么将数组划分为大小为5的块

Algorithm 中值算法:为什么将数组划分为大小为5的块,algorithm,time-complexity,array-algorithms,Algorithm,Time Complexity,Array Algorithms,在中值算法中,我们需要将数组分成大小为5的块。我想知道这些算法的发明者是如何想出神奇的数字“5”的,而不是,可能是,7,或9或其他什么?我想如果你检查一下维基页面的“O(n)运行时间证明”部分: 中位数计算递归调用不会超过最坏情况下的线性行为,因为中位数列表的大小是列表大小的20%,而另一个递归调用最多在列表的70%上递归,从而使运行时间缩短 O(n)项cn表示划分工作(我们对每个元素进行了固定次数的访问,以便将它们分成n/5组,并在O(1)时间内取每个中位数)。 由此,使用归纳法,我们可以很

在中值算法中,我们需要将数组分成大小为5的块。我想知道这些算法的发明者是如何想出神奇的数字“5”的,而不是,可能是,7,或9或其他什么?

我想如果你检查一下维基页面的“O(n)运行时间证明”部分:

中位数计算递归调用不会超过最坏情况下的线性行为,因为中位数列表的大小是列表大小的20%,而另一个递归调用最多在列表的70%上递归,从而使运行时间缩短

O(n)项cn表示划分工作(我们对每个元素进行了固定次数的访问,以便将它们分成n/5组,并在O(1)时间内取每个中位数)。 由此,使用归纳法,我们可以很容易地证明


这将有助于您理解原因。

对于算法,数字必须大于3(显然是奇数)。5是大于3的最小奇数。因此选择了5。

您也可以使用大小为3或4的块,如K.Chen和A.Dumitrescu(2015)的论文所示。其思想是使用“中间值”算法两次,然后再进行分区。这会降低枢轴的质量,但速度更快

因此,不是:

T(n) <= T(n/3) + T(2n/3) + O(n)
T(n) = O(nlogn)
T(n)参见上的说明。基本上,5是我们可以用来维持线性时间的最小数组。使用n=5大小的数组实现线性排序也很容易。为这件事道歉:

为什么是5

中位数将列表分为长度为5到5的子列表 获得最佳运行时间。记住,找到小的中间值 按蛮力排序的列表(排序)只需少量时间,因此 子列表的长度必须相当小。然而,调整 例如,子列表大小为3时,确实会更改 更糟

如果算法将列表划分为长度为3的子列表,pp 将大于大约\frac{n}{3}3 n​ 元素和 它将小于大约\frac{n}{3}3n​ 元素。 这将导致最坏情况\frac{2n}{3}3 2n​ 递归, 产生递归T(n)=T\big(\frac{n}{3}\big)+ T\big(\frac{2n}{3}\big)+O(n),T(n)=T(3n​ )+T(32n​ )+O(n), 根据主定理,它是O(n\logn),O(nlogn),速度较慢 比线性时间

事实上,对于形式T(n)\leq T(an)+T(bn)的任何重复+ 碳纳米管(n)≤T(an)+T(bn)+cn,如果a+b<1a+b1a+b>1,则复发率通常等于 \ω(n\logn)Ω(nlogn)。[3]

中值算法可以使用大于的子列表大小 5-例如,7-并保持线性运行时间。然而,我们需要 使子列表的大小尽可能小,以便对 子列表可以在有效的恒定时间内完成


这证明了使用20%的O(n)运行时间,它并不否定其他百分比的O(n)运行时间(如果其他百分比也是O(n),它不证明选择20%高于其他百分比)。它不必大于tan 3(奇数),见下面我的答案。是的,但这是一个不同的算法。这只是OP所问算法的一个微小变化-但它仍然是一个不同的算法。OP问“为什么在这个特定的算法中我们需要使用5个块”,而不是“在这个算法上有一个变体,我们可以使用更小的块”.他们试图了解某件事是如何计算出来的,而不是试图找出是否有什么不同的东西可以做得更好。
T(n) <= T(n/9) + T(7n/9) + O(n)
T(n) = Theta(n)