Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中从数组中查找最高值、最低值、总数、平均值和中值_Ruby_Math_Arrays_Boxplot - Fatal编程技术网

在Ruby中从数组中查找最高值、最低值、总数、平均值和中值

在Ruby中从数组中查找最高值、最低值、总数、平均值和中值,ruby,math,arrays,boxplot,Ruby,Math,Arrays,Boxplot,我正在用Ruby创建一个箱线图生成器,我需要计算一些东西 假设我有一个数组: arr = [1, 5, 7, 2, 53, 65, 24] 如何从上述数组中找到最低值(1)、最高值(65)、总数(157)、平均值(22.43)和中值(7) 谢谢,找到最小值、最大值、和和平均值是很简单的,而且可以很容易地在线性时间内完成,如上面sepp2k的回答所示 找到中间值不那么简单,简单的实现(排序,然后取中间元素)在O(nlogn)时间内运行 然而,也有一些算法可以在线性时间内找到中值(如中值5算法)。

我正在用Ruby创建一个箱线图生成器,我需要计算一些东西

假设我有一个数组:

arr = [1, 5, 7, 2, 53, 65, 24]
如何从上述数组中找到最低值(1)、最高值(65)、总数(157)、平均值(22.43)和中值(7)


谢谢,找到最小值、最大值、和和平均值是很简单的,而且可以很容易地在线性时间内完成,如上面sepp2k的回答所示

找到中间值不那么简单,简单的实现(排序,然后取中间元素)在O(nlogn)时间内运行

然而,也有一些算法可以在线性时间内找到中值(如中值5算法)。其他的甚至适用于任何类型的顺序统计(比如,你想找到第五个最小的元素)。问题是你必须自己实现它们,我知道没有Ruby实现


O(nlogn)已经相当快了,所以如果您不打算处理庞大的数据集(并且如果您仍然需要对数据进行排序),那么您就可以了。

如果
arr.length
可以被2整除,那么您需要更加小心地使用中值。应该始终有效的方法是
do sortedar=arr.sort;medpt1=arr.length/2;medpt2=(arr.length+1)/2;(分拣机[medpt1]+分拣机[medpt2])至2楼;结束
,但显然这比你的答案更昂贵,也没有你的答案那么漂亮。一个小提示:arr.inject(:+)只能在Ruby 1.8.7或更高版本中工作(或者如果另一个库实现了Symbol#to#u proc,就像Rails的ActiveSupport那样)。否则,arr.inject{| sum,n | sum+n}将起作用。@GregCampbell:
arr.inject(:+)
不调用
Symbol#to_proc
,inject在给定符号时直接调用
rb#funcall
(这比传递块快得多(或者更糟糕的是使用Symbol#to#to#proc))。但你是对的,它只适用于1.8.7+。因为你要对数组进行排序以找到中值,那么使用sorted.first和sorted.last来找到最小值和最大值是否会更有效?@davidardridge绝对值是,但是排序的时间复杂度是O(nlogn),并且会消耗O(n)大数据集的最小和最大操作。建议将行total=arr.inject(:+)更改为total=arr.inject(0,:+),以避免获取nil值
lowest = arr.min
highest = arr.max
total = arr.inject(:+)
len = arr.length
average = total.to_f / len # to_f so we don't get an integer result
sorted = arr.sort
median = len % 2 == 1 ? sorted[len/2] : (sorted[len/2 - 1] + sorted[len/2]).to_f / 2