2013-02-13 12 views
38

Wie berechne ich den Median eines Zahlenfeldes mit Ruby?Median in Ruby berechnen

Ich bin ein Anfänger und innerhalb des Fortschritts meines Lernens versuche ich bei dem zu bleiben, was bereits gelehrt wurde. Die anderen Fragen, die ich gefunden habe, liegen also außerhalb meines Rahmens.

Hier sind meine Notizen und mein Versuch:

  1. sortiert das Array in aufsteigender Reihenfolge.
  2. herauszufinden, ob es ungerade oder gerade ist.
  3. Wenn ungerade, teilen Sie die sortierte Array-Länge +1 in zwei Hälften. Das ist der Index des Medians. Gib diesen Wert zurück.
  4. wenn gerade, finde die mittleren zwei Zahlen des sortierten Arrays und teile sie in 1/2. Geben Sie diesen Wert zurück.
  5. Finden Sie die mittleren zwei Zahlen:
  6. teilen Sie die sortierte Array-Länge in zwei Hälften. Das ist Indexpunkt. erste mittlere Nummer.
  7. teilen sortierte Array-Länge + 2 in zwei Hälften. Dies ist der Index pt. von der zweiten mittleren Nummer.
  8. nehmen Sie Durchschnitt dieser beiden mittleren Zahlen.

    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 
    
+2

Was ist die eigentliche Frage? –

+1

Hier sind die Fragen: Schreiben Sie einen Median der Methode, der ein Array von Zahlen als Eingabe verwendet und den Medianwert zurückgibt. – tomgalpin

+1

Ich meinte was ist deine * Frage. Wenn Sie Fragen stellen, müssen Sie beschreiben, was passieren soll, was passiert, was von den Erwartungen abweicht und was Sie versucht haben. –

Antwort

69

Hier ist eine Lösung, die sowohl auf geraden und ungeraden Länge Array arbeitet und das Array nicht ändern:

def median(array) 
    sorted = array.sort 
    len = sorted.length 
    (sorted[(len - 1)/2] + sorted[len/2])/2.0 
end 
+0

Das ist hilfreich. Vielen Dank. Ich verstehe das. – tomgalpin

+0

'klasse Array def median sortierte = self.sort ... end end' ...' [3,1,4,1,6] .median' –

2

Wenn durch Median Berechnung Sie meinen this

Dann

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] 
+1

Funktioniert nicht in einem Array mit gerader Länge. – Reactormonk

+0

Ja, die gerade Nummer eins macht es zu einem if ... else Verfahren (in dem was ich bisher gelernt habe) – tomgalpin

+0

Muss kein if/sonst haben, siehe meine Antwort – nbarraille

-2

I t Hink es ist gut:

#!/usr/bin/env ruby 

#in-the-middle value when odd or 
#first of second half when even. 
def median(ary) 
    middle = ary.size/2 
    sorted = ary.sort_by{ |a| a } 
    sorted[middle] 
end 

oder

#in-the-middle value when odd or 
#average of 2 middle when even. 
def median(ary) 
    middle = ary.size/2 
    sorted = ary.sort_by{ |a| a } 
    ary.size.odd? ? sorted[middle] : (sorted[middle]+sorted[middle-1])/2.0 
end 

I sort_by eher als Art verwendet, weil es schneller: Sorting an array in descending order in Ruby.

1

Ähnlich nbarraille ist, aber ich finde es ein bisschen leichter zu verfolgen, warum diese funktioniert:

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 = Anzahl der Elemente bis einschließlich (für Array mit einer ungeraden Anzahl von Elementen) Mitte des Arrays.

Noch einfacher:

class Array 
    def median 
    sorted = self.sort 
    mid = (sorted.length - 1)/2.0 
    (sorted[mid.floor] + sorted[mid.ceil])/2.0 
    end 
end 
0
def median(array) 
    half = array.sort!.length/2 
    array.length.odd? ? array[half] : (array[half] + array[half - 1])/2 
end 

* Wenn die Länge gerade ist, müssen Sie den Mittelpunkt und den mittleren Punkt hinzufügen - 1 zu Konto für den Index, beginnend bei 0

+0

mit 'array.sort!' Ist keine gute Idee seit es wird den Parameter ändern – RainChen

1
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 
+0

Es gibt viele Möglichkeiten, dies zu tun, aber Ihre Antwort ist die eleganteste. Sehr klar, was vor sich geht. – SeattleDucati

+0

Wenn die array.length nicht ungerade ist, dann gerade ist, oder könnte es etwas anderes sein? Ist es notwendig, den Ausdruck nach sonst ?, sind auch die Rückkehr erforderlich? –

Verwandte Themen