Friday 31 March 2017

Bewegungsdurchschnittlich C Scharf

Um eine asymptotische Leistung von O n zu erreichen, wie die handcodierte Lösung, können Sie die Aggregate-Funktion wie in verwenden. Der akkumulierte Wert, der als anonymer Typ implementiert wird, enthält zwei Felder Ergebnis enthält die Ergebnisliste, die bis jetzt aufbaut Perioden-1-Elemente Die Aggregat-Funktion fügt den aktuellen Wert der Arbeitsliste hinzu, baut den aktuellen Durchschnitt und fügt sie dem Ergebnis hinzu und entfernt dann den ersten ältesten Wert aus der Arbeitsliste. Der Samen, dh der Startwert für die Akkumulation, wird aufgebaut Indem du die ersten Perioden-1-Elemente in die Arbeit und Initialisierung Ergebnis in eine leere Liste. Conently tha Aggregation beginnt mit Element Zeitraum durch Überspringen Periode-1 Elemente am Anfang. In Funktions-Programmierung ist dies ein typisches Verwendungsmuster für die aggretate oder fold-Funktion , Btw. Die Lösung ist nicht funktionell sauber, dass die gleichen Listenobjekte Arbeit und Ergebnis in jedem Schritt wiederverwendet werden Ich bin mir nicht sicher, ob das Probleme verursachen könnte, wenn einige zukünftige Compiler versuchen, die Aggregate-Funktion automatisch zu ergänzen, andererseits auch ich Nicht sicher, wenn das überhaupt möglich ist. Eine rein funktionale Lösung sollte bei jedem Schritt neue Listen erstellen. Beachten Sie auch, dass C mächtige Listenausdrücke fehlt. In einem hypothetischen Python-C-gemischten Pseudocode könnte man die Aggregationsfunktion schreiben Etwas eleganter in meiner bescheidenen Meinung. Geben Sie die Laufzeit von O n 2 an, da Sie mehr und mehr Elemente bei jedem Schritt überspringen müssen und afaik Skip ich muss ich mal anrufen Meine Antwort auf eine Lösung in O n Zeit, die ich gerade bemerkt habe Die OPs kommentieren unten, dass er sie möglicherweise die Werte aus einer SQL DB in der Zukunft bekommen würde. In diesem Fall würde ich jeden stark davon abhalten, von dieser Lösung MartinStettner Mar 3 11 bei 0 53.Für die effizienteste Möglichkeit, einen Moving Average mit zu berechnen LINQ, du solltest nicht LINQ verwenden. Stattdessen schlage ich vor, eine Helper-Klasse zu schaffen, die einen gleitenden Durchschnitt in der effizientesten Weise mit einem kreisförmigen Puffer und einem kausalen gleitenden Durchschnittsfilter berechnet, dann eine Erweiterungsmethode, um sie für LINQ zugänglich zu machen. Die gleitende Durchschnitt. Diese Klasse bietet eine sehr schnelle und leichte Implementierung eines MovingAverage-Filters Es schafft einen kreisförmigen Puffer der Länge N und berechnet eine add, eine Subtraktion und eine Multiplikation pro Datenpunkt angehängt, im Gegensatz zu den N Multiplikations-Adds pro Punkt für die Brute-Force-Implementierung. Die oben erwähnte Erweiterungsmethoden wickeln die MovingAverage-Klasse ein und erlauben das Einfügen in einen IEnumerable-Stream. Um dies in einer funktionelleren Weise zu tun, brauchst du eine Scan-Methode, die in Rx existiert, aber nicht in LINQ. Let s Look Wie es aussehen würde, wenn wir eine Scan-Methode haben. Und hier ist die Scan-Methode, genommen und angepasst von hier. This sollte bessere Leistung als die Brute-Force-Methode, da wir eine laufende Summe verwenden, um die SMA zu berechnen Wir müssen die erste Periode berechnen, die wir hier Samen nennen. Dann ist jeder nachfolgende Wert, den wir aus dem akkumulierten Samenwert berechnen. Dazu brauchen wir den alten Wert, der t-delta und der neueste Wert ist, für den wir die Serie einmal zipieren Von Anfang an und einmal von der delta verschoben. Am Ende machen wir einige Aufräumarbeiten durch Hinzufügen von Nullen für die Länge der ersten Periode und Hinzufügen der Anfangssamen Wert. answered Jun 19 13 bei 22 58.Wenn die Leistung dieses Codes kritisch ist, Dann könnte es sinnvoll sein, Haufen Zuweisungen für Kerzen zu vermeiden Ich denke, die vernünftigste Art und Weise zu tun, dass wäre Kerze in eine struct. Though veränderliche Wertarten sind böse, so würde ich auch umgestalten Kerze unveränderlich Dies bedeutet auch die Umsetzung von NewestCandle müsste sich ändern, vermutlich in ein Paar Doppelfelder oder alternativ eine separate, veränderliche und rücksetzbare Klasse. Ich sehe kein anderes potenzielles Leistungsproblem in deinem Code Aber wenn es um Leistung geht, solltest du dich immer auf Profiling verlassen, Nicht dein oder jemand anderes s intuition. Also, ich don t wie einige Namen Ihrer Methoden Specifically. ValueUpdated Methoden Namen sollten in der Regel in der Form etwas tun, nicht etwas passiert Also ich denke, ein besserer Name wäre UpdateValue. Add Ändern Dies sind Die beiden grundlegenden Operationen von Ihrem MovingAverage und ich denke, dass diese Namen don t ausdrücken die Bedeutung gut Ich würde sie so etwas wie MoveAndSetCurrent und SetCurrent jeweils nennen, obwohl diese Namensgebung zeigt, dass die grundlegenden Operationen sollte eher Move und SetCurrent. I haben eine 4000 Menge Daten Von Aktien und Tring, um den gleitenden Durchschnitt für alle Datenwerte zu berechnen, aber da der gleitende Durchschnitt auf vorherigen Daten basiert und ich kann nicht berechnen die 15-Tage-SMA für die ersten 14 Tage, überspringen Sie die ersten 14 Tage und berechnen die SMA auf Der Rest der Daten Und es muss LINQ verwenden, um zu erreichen Kann jemand geben Sie eine Probe oder Hinweis, wie man mit LINQ zu berechnen gleitenden Durchschnitt Die Ausgabe für die durchschnittlichen Werte sind rund 500 si wirklich don t verstehen, wie ist das möglich Erhalten diesen hohen Wert. Moving averager mit Summenarray 2006 07 2012 562 49 571 72.06 08 2012 565 84 580 32.06 11 2012 568 56 571 17.06 12 2012 569 55 576 16.06 13 2012 570 56 572 16.06 14 2012 570 63 571 53.06 15 2012 571 21 574 13.06 18 2012 572 78 585 78.06 19 2012 573 79 587 41.06 20 2012 574 23 585 74.06 21 2012 574 22 577 67.06 22 2012 575 63 582 10.06 25 2012 576 06 570 77.06 26 2012 576 68 572 03.06 27 2012 576 88 574 50.06 28 2012 576 7 569 05.06 29 2012 576 95 584 00.07 02 2012 578 37 592 52.07 03 2012 579 92 599 41.07 03 2012 581 74 599 41.Gebiet von Leemx Freitag, 16. November 2012 2 59 AM. Moved von Lisa Zhu Microsoft Kontingent Mitarbeiter Montag, 19. November 2012 7 38 AM linq in Verbindung Von Visual C General. Friday, 16. November 2012 2 42 AM. Um einen gleitenden Durchschnitt zu schaffen, würde ich beginnen, indem Sie einen Bereich von 0 bis Länge der Datenliste - Länge des Bewegungszeitraums, dann für jeden Wert im Bereich Auswahlelemente x bis x Länge der Bewegungsperiode und berechnen den Durchschnitt. All in einer schönen LINQ-Anweisung. Hinweis, dass dies nicht sehr effizient ist, da Sie grundsätzlich über die Datenliste iterieren Jeder Wert in der range. Hey, schauen Dieses System erlaubt Unterschriften von mehr als 60 cha. Edited von Arno Brouwer Freitag, 23. November 2012 4 42 PM. Marked als Antwort von Alexander Sun Freitag, 07. Dezember 2012 2 44 AM. Friday , 23. November 2012 4 41 PM. All Antworten. Ein Beispiel für Ihre LINQ-Anweisung würde helfen. Prematur-Optimierung ist die Wurzel aller bösen - Knuth. To schaffen einen gleitenden Durchschnitt, würde ich beginnen, indem Sie eine Reichweite von 0 bis Länge von Datenliste - Länge des Bewegungszeitraums, dann für jeden Wert im Bereich Auswahlelemente x bis x Länge der Bewegungsperiode und berechnen den Durchschnitt. All in einer schönen LINQ Anweisung. Hinweis, dass dies nicht sehr effizient ist, da Sie im Grunde über die Datenliste für jeden Wert in der range. Hey, look Dieses System ermöglicht Signaturen von mehr als 60 cha. Edited von Arno Brouwer Freitag, 23. November 2012 4 42 PM. Marked als Antwort von Alexander Sun Freitag, 07. Dezember 2012 2 44 AM. Friday, 23. November 2012 4 41 PM. Microsoft führt eine Online-Umfrage durch, um Ihre Meinung über die Msdn-Website zu verstehen Wenn Sie sich für die Teilnahme entscheiden, wird Ihnen die Online-Umfrage vorgestellt, wenn Sie die Msdn-Website verlassen Sie möchten teilnehmen. Halten Sie uns verbessern MSDN. Visit unsere UserVoice Seite zu unterwerfen und abstimmen auf Ideen. Dev Zentren. Learning Ressourcen.


No comments:

Post a Comment