【问题标题】:Can you optimize this descending sorting array with Ruby?你能用 Ruby 优化这个降序排列的数组吗?
【发布时间】:2012-11-29 23:35:12
【问题描述】:

您知道执行以下操作的更好、更快、更智能、更高效或更优雅的方式吗?

由于这个数组

a = [171, 209, 3808, "723", "288", "6", "5", 27, "22", 207, 473, "256", 67, 1536] 

得到这个

a.map{|i|i.to_i}.sort{|a,b|b<=>a}
 => [3808, 1536, 723, 473, 288, 256, 209, 207, 171, 67, 27, 22, 6, 5]

【问题讨论】:

    标签: ruby arrays sorting


    【解决方案1】:

    您可以使用就地突变来避免创建新数组:

    a.map!(&:to_i).sort!.reverse!
    

    不过,如果没有基准,很难知道它是否更快或更高效。

    【讨论】:

    • 酷!这确实有效,但让我看看,只是一会儿,如果其他人有其他想法......
    • 请注意,这是一个就地突变,因此它会修改 original 数组。这对 RAM 有好处,但如果在此范围之外的任何地方使用该数组,则可能会产生副作用。
    • 如果您想保留原始的a 数组,但仍然从就地排序和反向中获得一些空间和时间优势,只需在上面的答案中使用map 而不是map!
    【解决方案2】:

    这是一个使用symbol#to_proc

    a.map(&:to_i).sort.reverse
    

    这比使用就地修饰符 (!) 方法更快,但使用更多内存。作为奖励,如果您想用它做任何其他事情,它会保持原始数组 a 完好无损。

    【讨论】:

    • @edgerunner - 是什么让它比就地更快?如果有的话,我希望额外的分配会使非可变方法稍微慢一些(尽管不够明显)。
    • @ChrisHeald,我记得读过 ruby​​ 在内部使用合并排序和就地合并排序算法。见comparison
    • 有趣。去红宝石源我去!谢谢!
    猜你喜欢
    • 2019-11-05
    • 2021-06-03
    • 2010-09-27
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多