代码超时Ruby

时间:2016-10-02 18:28:31

标签: ruby median continuous

根据一组数字中的元素数量是奇数或偶数,该组的中位数分别定义为中间值或列表中两个中间值的平均值,这些值是在对该集合进行排序时产生的。 / p>

以下是用于计算"运行"的代码。数字列表的中位数。 "运行"中位数是一个动态中位数,随着新数字的出现重新计算,因为列表会扫描到目前为止出现的所有数字。输入是一个整数n后跟一个n个整数的列表,输出应该是"运行"扫描列表时列表的中位数。例如,

3
4
1
5

应该产生

4
2.5
4

因为4是[4]的中位数,2.5((1 + 4)/ 2)是[4,1]的中位数,4又是[4,1,5]的中位数。

我的程序运行正常,但是对于非常大的输入,它会超时。我怀疑这个复制步骤是个问题。

a=(a[0,(k=a.index(a.bsearch{|x|x>=t}))].push(t) + a[k,a.length-k])

但我不确定,因为据我所知,这份副本本来就是一份浅薄的副本。此外,我没有在任何地方进行常规插入,这将涉及移动元素,从而导致代码速度变慢,进入包含数字的数组。

n=gets.chomp.to_i
a=[]
n.times do
    t=gets.chomp.to_i

    a==[]||(t<=a.first) ? a.unshift(t): t>=a.last ? a.push(t) : a=(a[0,(k=a.index(a.bsearch{|x|x>=t}))].push(t) + a[k,a.length-k])


    p (l=a.count)%2==0 ? ((a[l/2] + a[l/2-1])/2.0).round(1):a[(l-1)/2].round(1)
end

有人可以指出问题出在哪里吗?谢谢。

这是一个不太模糊的版本。

n=gets.chomp.to_i
a=[]
n.times do
    t=gets.chomp.to_i


    if a==[]||(t<=a.first) 
        a.unshift(t)
    else 
        k=a.index(a.bsearch{|x|x>=t})
        if k.nil? == true
            k=a.length
        end
        a=a[0,k].push(t)+ a[k,a.length-k]
    end
    p (l=a.count)%2==0 ? ((a[l/2] + a[l/2-1])/2.0).round(1):a[(l-1)/2].round(1)
end

1 个答案:

答案 0 :(得分:0)

我想......

a=(a[0,(k=a.index(a.bsearch{|x|x>=t}))].push(t) + a[k,a.length-k])

...因为它每次都在创建一个新数组,随着数组变大,这可能是一项昂贵的操作。

更好的可能是改变原始数组的东西。

a.insert((a.index{|x|x>t} || -1), t)

它还处理小于第一个或大于最后一个的边缘情况,因此您可以删除这些测试。也适用于第一次传递(空数组a