Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 合并大小为n的k个排序数组的下界_Algorithm_Sorting_Merge_Time Complexity_Lower Bound - Fatal编程技术网

Algorithm 合并大小为n的k个排序数组的下界

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

正如标题所示,我想知道合并大小为n的k排序数组的下界的证明是什么?我知道界是O(kn*log[k]),但这是如何实现的呢?我尝试将其与使用决策树对p元素数组进行排序进行比较,但我不知道如何实现这个证明

这很容易证明,试着用合并排序的方式来考虑。

要对大小为K*N的数组进行合并排序,需要O(KN*log(K*N))

但是我们不必到达大小为1leafs,因为我们知道当数组大小为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)