【问题标题】:How many number of elements can be sorted in Θ(log n) time using heap sort? [closed]使用堆排序可以在 Θ(log n) 时间内对多少个元素进行排序? [关闭]
【发布时间】:2014-02-05 00:28:04
【问题描述】:

使用堆排序可以在 Θ(log n) 时间内对多少个元素进行排序?

当我们进行堆排序时,为了构建堆,我们需要 Θ(n) 复杂度,然后进行堆排序 O(nlog n)。我理解这个概念。但是当涉及到我们这里的问题时,我们甚至无法在 Θ(log n) 时间内构建一个 n 个元素的堆。那么考虑输入大小 n 的答案是 O(1) 吗?

我还看到了一个不同的解释,它在考虑输入大小 logn 的情况下得出复杂度为 Θ(log n/log log n)。我也不完全遵循这种方法。那么哪个是正确答案,为什么?

【问题讨论】:

  • 有人能告诉我标题如何有意义吗?复杂度是元素数量(输入大小)的函数,你怎么能问,你可以排序多少?这听起来像是在问f(x) 是什么(最大的)x。 PS。我假设“有多少元素”是“有多少元素”。
  • "使用堆排序可以在 Θ(log n) 时间内对多少个元素进行排序?"对我来说没有任何意义。
  • 我认为答案是“n”。
  • 对列表中的log(n) 元素进行排序是没有用的。 n 元素列表的最快排序方法采用 O(n) 并且仅在特殊情况下有效...
  • @Codie 我认为答案是01。因为你不能用堆排序比n log n 更快地排序,所以也许一些类似零的边界情况输入可以解决问题。

标签: algorithm sorting time-complexity heapsort


【解决方案1】:

我认为问题是“假设某处有一个已知的 n 值,作为 n 的函数的数组大小的渐近界是多少,其中使用 heapsort 对该数组进行排序将花费时间 Θ(log n)?”

随着 k 的增长,对具有 k 个元素的数组进行排序需要时间 Θ(k log k)。您想选择 k 使得 Θ(k log k) = Θ(log n)。选择 k = Θ(log n) 不一定有效,因为 Θ(k log k) = Θ(log n log log n) ≠ Θ(log n)。另一方面,如果你选择 k = Θ(log n / log log n),那么排序的运行时间将是

Θ((log n / log log n) log (log n / log log n))

= Θ((log n / log log n) (log log n - log log log n))

= Θ(log n - log n log log log n / log log n)

= Θ(log n (1 - log log log n / log log n))

请注意,随着 n 趋于无穷大,1 - log log log n / log log n 趋于 1,因此根据需要,上述表达式实际上是 Θ(log n)。

因此,如果您尝试使用堆排序对大小为 Θ(log n / log log n) 的数组进行排序,作为 n 的函数,运行时间为 Θ(log n)。

希望这会有所帮助!

【讨论】:

  • 很好的答案。但是你能告诉我为什么单一方法在这里失败了吗?对于 n 个元素,需要 nlogn 时间。因此,如果需要 logn 时间,则元素数为 (n)(logn)/nlogn,即 1。这种方法的缺陷是什么?
  • 我不确定您是如何得出第二个比率的。你能详细说明一下吗?
  • @templatetypedef 我没有派生任何东西。我只是使用单一方法,它说如果 X 单位采用 Y 时间单位,那么 Z 单位将采用 (ZY)/X 时间单位,这在此处不起作用。我找不到原因。
  • 好的,我现在明白为什么这种幼稚的除法方法不起作用了。此方法仅适用于图形(或函数)的斜率为 1(或与 x 轴成 45 度),如 y=x 或 y=2x。如果假设一个算法需要 2n 个时间单位,输入数量为 n,那么我们可以应用这种方法,但这里 nlogn 中的 logn 部分破坏了一切。
【解决方案2】:

对 N 个元素进行排序,时间 = O(NlogN) 这基本上意味着,对每个元素进行排序将花费 O(logN) 时间

【讨论】:

  • “对每个元素进行排序”听起来 / 是错误的。也许您想说“您需要(平均)为每个元素做 O(log n) 工作”。但无论如何,OP 已经知道堆排序需要 O(n log n) 时间,所以这并没有真正添加任何信息。
  • 嗯,我的理解是,每次你将一个元素插入到一个堆中到一个排序位置需要 O(logN) 时间。在这里,一个元素也可以解释为恒定数量的元素。
  • 如果堆中还没有元素,你只需要做 O(1) 的工作来插入一个元素,所以你肯定需要一个“平均”的地方。而且你不能真的说你正在对一个元素进行排序,因为这意味着(至少对我而言)你正在对实际元素进行排序(例如,你有一个数组数组,并且你正在排序数组中的一个,而不是数组的数组)或者排序可以在每个元素的基础上进行,而不必关心任何其他元素,而这正是排序所不具备的。
  • 我认为大 O 符号会自动忽略小写。
猜你喜欢
  • 2016-05-01
  • 2012-04-16
  • 1970-01-01
  • 2014-03-10
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
相关资源
最近更新 更多