-1
votes

Ajouter une valeur précédente à chaque valeur de hachage

J'ai un hasch avec des valeurs entières: xxx

Je dois ajouter 100 à la première valeur et pour la deuxième valeur et sur, j'ai besoin de Ajoutez la valeur précédente à la valeur d'origine pour obtenir: xxx

est là un bon moyen d'y parvenir?


6 commentaires

Votre problème n'est-il pas en mesure de pouvoir exécuter le . CODE ou vous avez besoin d'aide avec l'algorithme lui-même?


Je demandais s'il y a une meilleure façon de rubis d'atteindre ce @Elvinas


Le temps n'est pas crucial pour votre problème. Vous devez simplifier le hasch pour faire votre point.


Ceci s'appelle Prefix-Sum ou Scan et est en effet étrangement manquant de la bibliothèque de collections de Ruby.


À moins que vous ayez une bonne raison de le faire, ce n'est généralement pas une bonne idée de supposer que les clés de hachage ont un ordre particulier.


@CarySwoveland Le hash génère à partir d'une sélection de SQL commandée par date


4 Réponses :


6
votes

Vous pouvez utiliser injecter pour calculer la somme totale: xxx

et en le faisant, vous pouvez également définir les valeurs de hachage pour obtenir une somme accumulée: xxx < / pré>


2 commentaires

Ce problème a de nombreuses gaines, l'un étant de convertir une fonction de densité de probabilité discrète à une fonction de distribution cumulative. Vous avez fourni une bonne façon de le faire. Est-ce une première: votre réponse a été modifiée?


@CarySwoveland ha! Je suis généralement l'une des réponses d'édition à inclure des liens :-) On dirait que j'étais pressé.



1
votes

Peut-être que ce n'est pas la solution la plus efficace, mais elle est définitivement gentille et lisible.

accumulated_sum = 0
h.each do |key, value|
  accumulated_sum += value
  hash[key] = 100 + accumulated_sum
end


1 commentaires

J'ai édité votre réponse en fonction de mon édition de la question.



3
votes

Vous pouvez simplement garder une trace de la somme en tant que variable externe:

sum = 100
h.transform_values{|v| sum += v} # => {:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}


0 commentaires

3
votes

solution immuable qui ne modifie pas l'entrée:

h.each_with_object({sum: 100, outcome: {}}) do |(k, v), acc|
  acc[:outcome][k] = acc[:sum] += v
end
#⇒ {:sum=>107, :outcome=>{:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}}


0 commentaires