Algorithm 合并大小为n的k个排序数组的下界
正如标题所示,我想知道合并大小为n的k排序数组的下界的证明是什么?我知道界是O(kn*log[k]),但这是如何实现的呢?我尝试将其与使用决策树对p元素数组进行排序进行比较,但我不知道如何实现这个证明 这很容易证明,试着用合并排序的方式来考虑。Algorithm 合并大小为n的k个排序数组的下界,algorithm,sorting,merge,time-complexity,lower-bound,Algorithm,Sorting,Merge,Time Complexity,Lower Bound,正如标题所示,我想知道合并大小为n的k排序数组的下界的证明是什么?我知道界是O(kn*log[k]),但这是如何实现的呢?我尝试将其与使用决策树对p元素数组进行排序进行比较,但我不知道如何实现这个证明 这很容易证明,试着用合并排序的方式来考虑。要对大小为K*N的数组进行合并排序,需要O(KN*log(K*N)) 但是我们不必到达大小为1的leafs,因为我们知道当数组大小为N时,它会被排序。为简单起见,我们假设K是2的幂。 我们需要除以2多少次才能得到大小为N的叶子? K次 可视化 因此您有l
要对大小为K*N的数组进行合并排序,需要O(KN*log(K*N)) 但是我们不必到达大小为1的leafs,因为我们知道当数组大小为N时,它会被排序。为简单起见,我们假设K是2的幂。
我们需要除以2多少次才能得到大小为N的叶子?
K次
可视化
因此您有log(k)步骤,然后必须合并每个步骤成本KN,并且有log(k)步骤。因此,时间复杂度为O(NK(log(K))
证明:
假设它不是一个下限,我们可以得到更好的结果。然后,对于任何大小为N*K的未知数组,我们可以将其拆分为2,直到我们得到大小为N的子数组,在Nlog(N)时间内对大小为N的每个数组进行合并排序,并对所有数组进行总计K*N*log(N)时间 在对大小为N的K个数组进行排序后,我们必须将它们合并为大小为N*K的更大数组,并支付小于O(NK*(log(K))的费用,因为我们假设这不是下限 最后,您以小于N*K*log(N*K)的复杂度对大小为N*K的未知数组进行排序,这在比较模型中是不可能的。
因此,在合并大小为N的K个排序数组时,无法获得比O(NK*(log(K))更好的结果。可能的实现。
让我们创建一个存储按元素排序的成对
(element,arrayIndex)
,然后
p
,将p.element
添加到结果中,并将对(下一步,p.arrayIndex)
插入堆中,其中下一个元素具有p.arrayIndex
索引(如果它不为空)k
索引/指针/迭代器
在任何时候堆中最多会有
k
个元素,因此堆的insert
/remove
操作将具有O(log(k))
复杂性。每个元素将从堆中插入和移除一次。元素的数量为n*k
。总体复杂性为O(n*k*log(k))
创建一个大小为k的最小堆,用于存储k个数组中的下一项。每个节点还存储它来自哪个数组。通过将堆中的最小值添加到最终的排序数组,然后将值来自数组的下一个元素添加到堆中,来创建排序数组
移除堆的最小elt为O(日志k)。您总共有NK个元素,因此您可以执行NK次。最终结果:O(NK日志k)