【问题标题】:Array.sort vs Array.take(x).sort PerformanceArray.sort 与 Array.take(x).sort 性能
【发布时间】:2015-04-10 02:37:38
【问题描述】:

我有一个包含 3000 个数字的数组。

用户抓取一个号码,然后在接下来的 5 秒内任意时间放回号码。

我希望用户每次都取数组中最小的数字。

在高峰期,最多有 100 人同时抓取和替换号码。与对整个数组进行排序相比,选择前 100 个并对其进行排序会更便宜吗?

我使用 Rails serialize 在 PostgreSQL 中使用 YAML 存储我的数组

【问题讨论】:

  • 与所有与性能相关的问题一样:对其进行基准测试。
  • 这是一个奇怪的问题,因为结果没有可比性。无论如何,取前 101 个元素比排序相同数量的元素花费的时间要少得多,排序 101 个元素所花费的时间只是排序 30 倍的时间的一小部分,因此基准测试是浪费时间。跨度>
  • @muistooshort 这已经回答了我 50% 的问题。
  • @shiva 你想做什么?如果您有 [7, 3, 5, 10, 2, 8, 6, 1, 9, 4],则对前 3 个项目进行排序会得到 [3, 5, 7],而不是 [1, 2, 3]。结果完全不同。
  • 我有一个队列,用户可以在其中抓取号码并将其放回原处。我希望每次@Stefan 都返回最小的数字

标签: ruby arrays performance postgresql


【解决方案1】:

我希望用户每次都取数组中的最小数字 (...) 选择一个数字范围并仅对该部分进行排序会更便宜吗?

它将返回该范围内的最小数字,但不是数组内的最小数字:

arr = [7, 3, 5, 10, 2, 8, 6, 1, 9, 4]

arr.take(3).sort #=> [3, 5, 7]
# vs
arr.sort.take(3) #=> [1, 2, 3]

我使用 Rails serialize 在 PostgreSQL 中使用 YAML 存储我的数组

对包含 3,000 个数字的 Ruby 数组进行排序只需不到一毫秒。反序列化 YAML 字符串要慢得多

【讨论】:

  • 我很高兴我们都了解范围和数组之间的区别。您在第一个引号中取出的文字是问题的定义。
  • 但是感谢您澄清反序列化 YAML 比 Ruby 排序更昂贵:我正在尝试找到最有效的方法来持久化和读/写这个数组。欢迎任何想法
  • @shiva “我正在努力寻找最有效的方式来持久化和读/写这个数组” - 你应该发布一个新问题。
【解决方案2】:

大多数排序算法的复杂性是严格单调递增的,平均而言是数组长度(n、n log n、n^2、n n! 等)。特别是,Ruby 似乎使用快速排序,即 n log n。因此,对包含 3000 项的数组进行排序比对包含 100 项的数组进行排序更昂贵。

【讨论】:

  • 除了你是绝对正确的,我想知道对未排序数组的某些部分进行排序是什么感觉?
  • @sawa : 完美答案.. 1+
  • @sawa 谢谢你的回答,但它回答了一半的问题。完整的问题是在选择数组内的范围然后对数组进行排序和简单地对整个数组进行排序这两个过程之间。选择需要任何时间吗?
  • @shiva 为此,您必须实际测试它,但我想选择一个范围可以忽略不计。
  • 如何回答一个有 3 个反对票、有 4 个赞成票的问题,而不会以任何形式或形式厚颜无耻。我给小费了
猜你喜欢
  • 1970-01-01
  • 2016-11-10
  • 2011-06-10
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多