Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Jetzt habe ich ein Problem. Ich brauche, um eine effiziente Sortierung von Arrays mit großen "Kosten" von Elementen Kopieren (dh Elemente, von denen große, "schwere" Strukturen, Klasse Objekte, lange Strings, etc.). Der gesunde Menschenverstand legt nahe, dass wir sie an Ort und Stelle zu verlassen, sondern sortieren stattdessen eine Art von Zeigern - Indizes von Zellen ihrer ursprünglichen Position. Hier ist das Zitat von https://www.mql5.com/ru/forum/6476#comment_178318Оставим so weit, mit ihren vielen aktuellen Aufgaben, und implementieren Sie es in mql5.
Alles ist schon vor uns gestohlen worden :)
Tabellenkalkulationen in MQL5
Die Eingabe sollte eine Kopie des zu sortierenden Arrays sein, die Kommentare sollten kommentiert und das Unnötige auskommentiert werden
Alles ist schon vor uns gestohlen worden :)
Tabellenkalkulationen in MQL5
Die Eingabe sollte eine Kopie des zu sortierenden Arrays sein, die Kommentare sollten kommentiert und das Unnötige auskommentiert werden.
Du bist gemein! Du hast den Song ruiniert... Oder besser gesagt, ich habe es versucht. :)
// Es ist klar, dass es gute Näherungen gibt. Ich hätte genauso gut ein Beispiel aus der Standardbibliothek nehmen können. :)
Es gibt Muster. Und es gibt auch einige hervorragende Beispiele. Aber trotzdem. Hier ist es wichtig, alles so zu spezifizieren und zu debuggen, dass ein funktionsfähiges, eigenständig nutzbares Produkt entsteht. Außerdem (deshalb sende ich sie hier) - so schnell wie möglich. D.h. ich schlage vor, alle möglichen Leistungen bis auf Hundertstelprozent genau auszuschöpfen. :)
Dies ist die erste. Zweitens benötigen wir für Objekte die Anzahl der Index-Arrays gleich der Anzahl der Sortierkriterien, die im allgemeinen Fall mehrere sein können, + (vorzugsweise) Funktion des Einfügens in das nach mehreren Kriterien sortierte Array.
Du bist gemein! Du hast den Song ruiniert... Oder besser gesagt, Sie haben es versucht. :)
// Es ist klar, dass es gute Näherungen gibt. Ich hätte genauso gut ein Beispiel aus der Standardbibliothek nehmen können. :)
Es gibt Muster. Und sogar einige großartige. Aber trotzdem. Es ist wichtig, alles zu prüfen und zu debuggen, bis ein funktionsfähiges, eigenständiges Produkt entsteht. Und (deshalb sende ich es hierher) - die schnellste. D.h. ich schlage vor, alle möglichen Leistungen bis auf Hundertstelprozent genau auszuschöpfen. :)
Das ist der erste Punkt. Zweitens - für Objekte benötigen wir die Anzahl der Index-Arrays gleich der Anzahl der Sortierkriterien, die im Allgemeinen mehrere sein können, + (vorzugsweise) Funktion der Einfügung in sortiert nach mehreren Kriterien indizierten Array.
Dieselbe Antwort Tabellenkalkulationen in MQL5.
Es ist alles da. Unter einem konkreten Problem ist es möglich, unter Manipulation nicht Spalten, sondern Zeilen neu zu bilden, es gibt Spalten, für die es möglich ist, sie als verschiedene Typen zu deklarieren. Wenn der Tabellentyp derselbe ist, kann alles wiedergegeben werden.
Es wurde ein Inluder mit Sortierindizes für Basistypen erstellt.
Die Standardsortierung ist "absteigend", um in aufsteigender Richtung zu sortieren, setzen Sie das Flag für die Sortierrichtung auf false.
Testergebnisse: // Indizierung von Arrays double[], int[], string[]; sequentiell : raw array, descending array, ascending array
Bibliothek und Test im Anhänger.
Legen Sie den Indexer in den Ordner "MQL5\Include\Indexes\".
Hier ist eine Beispielklasse für die Arbeit mit OCL. Natürlich sind einige Dinge unvollständig und umständlich, aber vielleicht findet sie ja jemand nützlich.
Ich habe die Initialisierung ein wenig überarbeitet, jetzt kann man mehrdimensionale Berechnungen durchführen.
Tolles Thema!
Gerade stand ich vor einem Optimierungsproblem mit einem Algorithmus zum Auffinden eines Preisextremums (Minimum). Die Bedingungen sind wie folgt: Es gibt einen Balken, n Balken links und rechts davon liegen unter (über) seinem Maximum:
n ist ein freier, willkürlich gewählter Wert. Die Periode n ist immer ungerade, da die Summe der beiden Balken rechts und links immer eine gerade Zahl ist, zu der der mittlere Balken des eigentlichen Preisextremums addiert wird.
Ich habe nicht viel über die erste Version des Algorithmus nachgedacht und den offensichtlichsten Code geschrieben. Jetzt schreibe ich es in C# mit WealthLab-Plattform, aber ich denke, Sie können leicht verstehen, die Essenz der problematischen Algorithmus, hier ist der problematischste Teil davon:
Das ganze Problem liegt in der zweiten Schleife. Es behandelt gleichzeitig den linken und den rechten Zweig eines potenziellen Extremwerts und durchläuft daher nur (N - 1)/2 Balken, aber das ist nicht genug. Messungen zeigen, dass der Zeitaufwand für die Identifizierung eines Extremums in einer arithmetischen Progression von der Periode N abhängt, was sehr, sehr schlecht ist:
Wenn man die Perioden durchprobiert, braucht man die Zeit, um die arithmetische Progression zu summieren, und das ist ein sehr großer Wert.
Eine mögliche Lösung besteht darin, eine zusätzliche Variable einzuführen. Denn wenn ein Extremum identifiziert ist, ist garantiert, dass es rechts davon für (N - 1)/2 keinen Balken gibt, so dass ein neues Extremum identifiziert werden kann, das mit bar: current_bar + (N - 1)/2 beginnt. Allerdings müssen neben den Minima auch die Extrema ermittelt werden, und ein neues Minimum kann vor current_bar + (N - 1)/2 gefunden werden. Daher muss die Suche nach Extrema und Minima auf zwei Durchgänge aufgeteilt werden, was jeden Leistungsgewinn zunichte macht. Wir können zwei Durchläufe leicht in zwei Threads aufteilen, die gleichzeitig auf zwei Kernen in C# verarbeitet werden, aber ich würde gerne den optimalen Algorithmus finden und ihn zunächst optimieren. Ich warte auf die Hilfe von Experten.
Es handelt sich nicht um ein Optimierungsproblem.
Wenn man die Perioden durchprobiert, erhält man die Summe der arithmetischen Progression, und das ist ein sehr großer Wert.
Die Suche nach einem Extremum scheint ein Problem der Größenordnung O(n) zu sein, wobei n die Anzahl der Daten ist. Wie man das asymptotisch verschlechtern kann, d.h. O(n^2), kann ich mir gar nicht vorstellen. Oder Sie verwechseln die Begriffe.
Der einfachste Algorithmus ist ArraySort(), der schnell genug ist, etwa O(n * ln( n ) ), aber für dieses Problem wahrscheinlich überflüssig ist.
Sie könnten sich etwas Rekursives einfallen lassen, das schneller wäre.
Wie lange dauert es, das Minimum zu finden und für wie viele Takte? Nun, ich glaube nicht, dass Sie bei 100 Takten maximal anderthalb Sekunden suchen.
Der einfachste Algorithmus ist ArraySort(), die eingebaute Sortierung ist schnell genug, aber für diese Aufgabe wahrscheinlich überflüssig.
Die beste Sortierung ist O(n*log(n)). Genau genommen überflüssig.
Wir könnten uns etwas Rekursives einfallen lassen, das schneller wäre.
Langsamer. Rekursion ist meistens böse. Rekursiv? Dies ist wahrscheinlich ein Fall, bei dem es egal ist, wie man es macht, die Geschwindigkeit ist ungefähr gleich.
Nach Code:
Die Zyklen für min und max müssen explizit getrennt werden. Und beenden Sie die Schleife sofort, wenn sie fehlschlägt.
Im Prinzip ja. Aber immer noch nicht mehr als O(n).
OCL würde hier helfen. Die Asymptotik bleibt natürlich dieselbe. Aber die Geschwindigkeit könnte durchaus um das Hundertfache erhöht werden.