Comment calculer la médiane d'un tableau de nombres à l'aide de Ruby?
Je suis un débutant et dans les progrès de mon apprentissage, j'essaie de m'en tenir à ce qui a déjà été enseigné. Ainsi, les autres questions que j'ai trouvées dépassent mon cadre.
Voici mes notes et ma tentative:
prendre moyenne de ces deux nombres moyens.
def median(array)
ascend = array.sort
if ascend % 2 != 0
(ascend.length + 1) / 2.0
else
((ascend.length/2.0) + ((ascend.length + 2)/2.0) / 2.0)
end
end
Voici une solution qui fonctionne à la fois sur les tableaux de longueur pair et impair et qui ne modifiera pas le tableau:
def median(array)
sorted = array.sort
len = sorted.length
(sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
end
Si par calcul de la médiane, vous voulez dire ceci
Ensuite
a = [12,3,4,5,123,4,5,6,66]
a.sort!
elements = a.count
center = elements/2
elements.even? ? (a[center] + a[center+1])/2 : a[center]
Semblable à nbarraille, mais je trouve un peu plus facile de savoir pourquoi celui-ci fonctionne:
class Array
def median
sorted = self.sort
half_len = (sorted.length / 2.0).ceil
(sorted[half_len-1] + sorted[-half_len]) / 2.0
end
end
half_len = nombre d'éléments jusqu'à et y compris (pour un tableau avec un nombre impair d'éléments) milieu du tableau.
Encore plus simple:
class Array
def median
sorted = self.sort
mid = (sorted.length - 1) / 2.0
(sorted[mid.floor] + sorted[mid.ceil]) / 2.0
end
end
def median(array) #Define your method accepting an array as an argument.
array = array.sort #sort the array from least to greatest
if array.length.odd? #is the length of the array odd?
return array[(array.length - 1) / 2] #find value at this index
else array.length.even? #is the length of the array even?
return ( array[array.length/2] + array[array.length/2 - 1] )/2.to_f
#average the values found at these two indexes and convert to float
end
end
def median(array)
half = array.sort!.length / 2
array.length.odd? ? array[half] : (array[half] + array[half - 1]) / 2
end
* Si la longueur est paire, vous devez ajouter le point central plus le point central - 1 pour tenir compte de l'index commençant à 0
Solution plus correcte avec la gestion des cas Edge:
class Array
def median
sorted = self.sort
size = sorted.size
center = size / 2
if size == 0
nil
elsif size.even?
(sorted[center - 1] + sorted[center]) / 2.0
else
sorted[center]
end
end
end
Il y a une spécification à prouver:
describe Array do
describe '#median' do
subject { arr.median }
context 'on empty array' do
let(:arr) { [] }
it { is_expected.to eq nil }
end
context 'on 1-element array' do
let(:arr) { [5] }
it { is_expected.to eq 5 }
end
context 'on 2-elements array' do
let(:arr) { [1, 2] }
it { is_expected.to eq 1.5 }
end
context 'on odd-size array' do
let(:arr) { [100, 5, 2, 12, 1] }
it { is_expected.to eq 5 }
end
context 'on even-size array' do
let(:arr) { [7, 100, 5, 2, 12, 1] }
it { is_expected.to eq 6 }
end
end
end