【问题标题】:Basic Confusion on MERGE SORT’s DIVIDE stepMERGE SORT 的 DIVIDE 步骤的基本混淆
【发布时间】:2018-08-10 07:01:10
【问题描述】:

Merge Sort中,每个元素的Divide步骤的运行时间在CLRS中被认为是theta(1),即常数时间


我的困惑是:除法是一个基本操作,需要恒定的时间 C1。 现在,考虑伪代码

现在,当 MERGE-SORT 函数第一次调用时,将需要 C1 来划分输入 (注意:- 我们不考虑时间由 Merge 函数获取) 而这个 MERGE-SORT 会将输入 lg(n) 时间 ( 或者我们可以说它会称自己为 lg((n))次) 所以划分输入所花费的总时间应该是C1 * lg(n)theta(lg(n))


但在 CLRS 中:

如果我们考虑到,那么 Divide Step 将需要 theta(1) 时间(作为整体)

注意:lg 是以 2 为底的对数

附言- 提前抱歉,因为我的英语达不到那个分数。欢迎编辑:)

【问题讨论】:

  • 这里只是一个评论,库中合并排序的大多数实际实现都是bottom up merge sort的变体,其中除法步骤将n个元素的数组视为n次大小为1的运行,然后开始合并过程。混合自下而上合并排序可能首先使用插入排序对 k 个元素的组进行排序,然后对现在已排序的 n/k 个组使用合并排序。

标签: algorithm sorting mergesort


【解决方案1】:

一步除法确实需要固定时间O(1)

但与您的想法相反,总共有Θ(N) 部门(1+2+4+8+...N/2)。

无论如何这都没有考虑在内,因为总合并工作量是Θ(N Log N)

【讨论】:

  • 我们总共有 n 个元素(或者说数组大小为 n),要获得 1 个元素(或数组大小为 1),分母必须是 n,这里我们每次将 n 除以 2,因此 2^k = n 等于 k ​​= lg n
  • @Bhaskar:你的推理是错误的。实现 MergeSort 并安装一个计数器。 (或者再读一遍我的回答。)
  • 我不明白为什么 MERGE 步骤需要 O(nlogn) 时间。
  • @sakek21:单个合并步骤需要 O(N),总共有 O(N) 个合并步骤。但并非所有尺寸都相同。
  • 是的,我解决了递归关系并弄清楚了。接下来我该怎么做?删除我的答案还是编辑它?
【解决方案2】:

对归并排序的基本理解是这样的——假设我们有一个数组的两半已经排序。我们可以在 O(n) 时间内合并这两部分。

从数学上讲,函数 Merge Sort 为它的两半调用自己两次(DIVIDE 步骤),然后合并这两个(CONQUER 步骤)。

现在,如果我们解决这个递归关系(通过使用适当的数学分析),我们得到如下关系:

这清楚地表明,需要O(1)时间的DIVIDE步骤被调用了n次,而合并所有不同大小的较小一半的总合并工作量是O(n logn),这是上限。因此复杂度为 O(n logn)(感谢 Yves Daoust 的澄清)。

但是,DIVIDE 步骤只需要 O(1) 时间,称为 O(n) 时间。因此,除法的工作量为 O(n)。

【讨论】:

  • 如果一个除法需要 C1 时间,那么 log n 除法将花费 C1 * log n 即 O(log n) 不是吗
  • @YiğitArasTunalı 那么整个除法步骤将花费 O(log n),不是吗?
  • 数组不是分O(Log N)次而是O(N)次。
  • 我的错,我有点糊涂了。没错,它会被称为O(n)times
  • @YvesDaoust 请检查我编辑的答案。从中我明白了很多东西。
猜你喜欢
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
相关资源
最近更新 更多