【问题标题】:Counting Sort different approach计数排序不同的方法
【发布时间】:2018-11-29 01:37:16
【问题描述】:

在计数排序算法中,我们在给定数组中初始化一个大小为最大值的计数数组。此方法的运行时间为 O(n + Max value)。但是通过一个额外的循环,我们可以查找给定数组的最小值和最大值;

for 0 -> Length(given_array)
   if given_array[i] > max 
      max = given_array[i]
   if given_array[i] < min
      min = given_array[i]

然后使用该数据创建计数数组,假设在 95-100 之间。在某些情况下,我们可以极大地减少运行时间。但是,我还没有看到这样的方法。会不会还是计数排序算法,还是有别的名字我不知道。

【问题讨论】:

  • "We would decrease the run time tremendously." - 这取决于范围与最大值的比率。找到最小值通常会被省略,因为它需要额外的工作,而这可能不值得。但是是的,它仍然是计数排序,因为计数出现的基本思想是相同的——只是输入数组被有效地移动了。
  • 是的,但是计数排序的缺点之一是最大值的范围。我们可以用这种方式补偿它
  • 这实际上是计数排序,只是通常不以这种方式实现。来自wikipedia:“它的运行时间与项目数和最大最小键值之差呈线性关系”
  • 如果我没记错的话,它的复杂度仍然是O(n+k),如果我错了,请纠正我。
  • @aomerk 如果 k 是最大 - 最小,是的

标签: algorithm sorting


【解决方案1】:

当我们预先知道值将被限制在某个范围内时,通常会使用计数排序。

这个范围不需要从零开始;使用长度为 6 的数组绝对没问题,它的元素表示值 95 到 100 的计数(或者,就此而言,值的计数从 -2 到 3)。所以,是的,您的方法仍然是“计数排序”。

但是,如果您事先不了解此限制,则不可能通过完整传递数据以进行检查来获得更快的结果。

例如:假设您有 1,000,000 个元素,并且您知道它们都在 0-200 范围内,但您认为它们可能都在范围更窄。好吧,预扫描整个输入数组的成本将大于使用 201 个元素的工作数组的成本,这意味着与仅使用范围 0– 进行计数排序相比,它的成本可能超过它可能节省的成本200.

此方法的运行时间为 O(n + Max value)。

运行时是 O(max(num_elements, range_size)),由于 Landau (big-O) 表示法的魔力,它与 O 相同(num_elements + range_size)。只有当 max_value 渐近大于 num_elements 和 range_size 时,您的方法才会影响渐近复杂度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多