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