Gitan
Legacy Member
Ik stootte dit weekend op een (recursief) algoritme voor het berekenen van de mediaan. Dit is een heel andere aanpak dan eenvoudigweg de lijst (van N elementen) sorteren van klein naar groot en dan element op positie N\2 te nemen (voor een oneven N).
Als ik het algoritme doorloop, stel ik vast dat men idd. tot het juist resultaat komt, maar het probleem is dat ik deze aanpak conceptueel niet "zie"/vat/snap. Ik zou er nooit zelf zo opgekomen zijn. Het gaat niet over de syntax, die snap ik wel, maar over het algoritme zelf.
Wat ik ook niet goed begrijp is de berekening van de nieuwe waarde voor de tweede parameter vd functie indien de mediaan zich in de higherlist bevindt (position - lowerList.Count - 1)
Kan er iemand een uitleg voorzien die mij een aha-erlebnis kan bezorgen?
Hieronder het algoritme (in VB.net, met generics).
Als ik het algoritme doorloop, stel ik vast dat men idd. tot het juist resultaat komt, maar het probleem is dat ik deze aanpak conceptueel niet "zie"/vat/snap. Ik zou er nooit zelf zo opgekomen zijn. Het gaat niet over de syntax, die snap ik wel, maar over het algoritme zelf.
Wat ik ook niet goed begrijp is de berekening van de nieuwe waarde voor de tweede parameter vd functie indien de mediaan zich in de higherlist bevindt (position - lowerList.Count - 1)
Kan er iemand een uitleg voorzien die mij een aha-erlebnis kan bezorgen?
Hieronder het algoritme (in VB.net, met generics).
Code:
Function MedianValue(Of T As IComparable)(ByVal list As List(Of T), _
Optional ByVal position As Integer = -1) As T
' Provide a default value for second argument.
If position < 0 Then position = list.Count \ 2
' If the list has just one element, we've found its median.
Dim guess As T = list(0)
If list.Count = 1 Then Return guess
' This list will contain values lower and higher than the current guess.
Dim lowerList As New List(Of T)
Dim higherList As New List(Of T)
For i As Integer = 1 To list.Count - 1
Dim value As T = list(i)
If guess.CompareTo(value) <= 0 Then
' The value is higher than or equal to the current guess.
higherList.Add(value)
Else
' The value is lower than the current guess.
lowerList.Add(value)
End If
Next
If lowerList.Count > position Then
' The median value must be in the lower-than list.
Return MedianValue(lowerList, position)
ElseIf lowerList.Count < position Then
' The median value must be in the higher-than list.
Return MedianValue(higherList, position - lowerList.Count - 1)
Else
' The guess is correct.
Return guess
End If
End Function

