Löschen eines Arrays mit definierten Element(en) - Seite 9

 
Nikolai Semko:
Im Grunde genommen sind alle Algorithmen gleich. Jeder modifiziert das Array Element für Element, und jeder strebt nach Fedoseevs Variante, weil sie nichts Überflüssiges enthält.
Nur in meinem Fall ist es in Blöcken mit ArrayCopy getan, so gibt es einen Geschwindigkeitsvorteil.

Und was ist mit Pjotr? Sind alle "aufgerissen"? Niemand hat seinen Code in den Checker eingegeben. Ich frage mich, wie und in welchem Ausmaß er alle im Vorstand umgehauen hat.

 
Vladimir:

Ich habe über die Gründe nachgedacht und zwei Zeilen darin korrigiert, um ein Drittel der Elemente zu entfernen, nicht 0,1 %.

Fazit: Die Berechnung von Adressen in einem Array mit einem beliebigen Abstand zwischen ihren Nummern ist immer noch schlechter als die Verarbeitung von Elementen in einer Reihe in einem bestimmten Schritt, umso mehr in Schritt 1, der Compiler kann es optimieren.

Oh, ich verstehe, was Sie meinen. Irgendwie habe ich diesen Satz übersehen
Ja, natürlich ist es klar, aber trotzdem, selbst wenn ich jedes dritte Element wegwerfen muss (dann funktioniert ArrayCopy nicht mehr für mich und die Gewinne verschwinden) ist das Bild anders:

2018.11.13 13:46:01.524 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 332864; элементов - 667202; время выполнения = 66640 микросекунд
2018.11.13 13:46:01.531 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 332864; элементов - 667202; время выполнения = 5932 микросекунд
2018.11.13 13:46:01.537 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 332864; элементов - 667202; время выполнения = 5142 микросекунд
2018.11.13 13:46:01.544 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 332864; элементов - 667202; время выполнения = 5831 микросекунд
2018.11.13 13:46:01.552 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 332864; элементов - 667202; время выполнения = 5493 микросекунд
2018.11.13 13:46:01.563 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 958449; элементов - 667202; время выполнения = 11026 микросекунд

Die Pavlov-Variante funktioniert wirklich nicht, aber es gibt auch richtige und falsche Prüfsummen.

Dateien:
 
Artyom Trishkin:

Und was ist mit Peter? Hast du sie alle auseinandergenommen? Niemand hat seinen Code in den Checker eingegeben. Es ist interessant, wie und in welchem Ausmaß er jeden in diesem Gremium umgehauen hat.

Ich verstehe seinen Höhenflug immer noch nicht. Er hat immer noch keine fertige Funktion geliefert. Und wenn ich es für ihn fertig stelle, wird er mir wieder vorwerfen, alles neu zu machen. ))

 
Nikolai Semko:

Ich verstehe seinen Höhenflug immer noch nicht. Er hat immer noch keine fertige Funktion geliefert. Und wenn ich es für ihn fertig stelle, wird er mir wieder vorwerfen, alles neu zu machen. ))

Nun, wenn ich mir seinen Code von einem Mobiltelefon aus ansehe, habe ich den Eindruck, dass er auf eine "einfache Art und Weise" schreibt. Deshalb hat er die Funktion nicht angegeben - er macht alles in einer Reihe. Und sein Skript ist keine Funktion, sondern reiner Code. Natürlich darf ein solches Skript keine Funktion beinhalten, aber... Ich glaube, ihm fehlt ein Foto für seine Flüge :)

Aber das ist nur mein Gefühl.

 
Nikolai Semko:

Die Pawlowsche Variante wurde korrigiert.
Ihre Werte sind seltsam. Vielleicht haben Sie das Skript nach dem Profiling oder Debugging ausgeführt, ohne den Code neu zu kompilieren?
So funktioniert es bei mir:

Und in Ihrer Variante gibt es eine falsche Prüfsumme. Die Erstellung eines zusätzlichen Arrays ist überhaupt nicht rentabel, im Gegenteil, sie verlangsamt den Prozess und verbraucht zusätzliche Ressourcen.

Korrigiert.

int ArrayDelV(int &a[],const int val)
  { // вариант Vladimir
   bool Flags[]; // массив пометок на удаление
   int N,NewN,i,j;
   N=ArraySize(a);
   ArrayResize(Flags,N);
   if (ArrayInitialize(Flags,false)!=N) return(-1);
   NewN=N; // Сколько останется
   for(i=0;i<N;i++) {if(a[i]==val) {Flags[i]=true; NewN--;}}
   j=0;
   for(i=0;i<N;i++) {if(!Flags[i]) {a[j]=a[i]; j++;}}
   ArrayResize(a,NewN);
   return(NewN);
  }

Ich habe es ein paar Mal laufen lassen, aber die Ergebnisse hängen noch in der Luft - der Computer ist sehr beschäftigt und wird erst am Samstag wieder frei sein. Fragen Sie lieber jemand anderen. Aber die Prüfsumme stimmt jetzt überein. Für sehr spärliche unnötige Werte (0,1%)

2018.11.13 21:35:16.888 del_2 (GBPUSD.m,H1) Option Pastushak: Checksumme = 497057781; Elemente - 998984; Ausführungszeit = 418662 Mikrosekunden
2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) Variante Korotky: Checksumme = 497057781; Elemente - 998984; Ausführungszeit = 10683 Mikrosekunden
2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) Variante Fedoseev: Checksumme = 497057781; Elemente - 998984; Ausführungszeit = 9740 Mikrosekunden
2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) Variante Semko: Checksumme = 497057781; Elemente - 998984; Ausführungszeit = 4691 Mikrosekunden
2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) Variante Pavlov: Checksumme = 497057781; Elemente - 998984; Ausführungszeit = 12512 Mikrosekunden
2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) Variante Nikitin: Prüfsumme = 497057781; Elemente - 998984; Ausführungszeit = 10720 Mikrosekunden
2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) Variante Vladimir: Checksumme = 497057781; Elemente - 998984; Ausführungszeit = 17197 Mikrosekunden

für ein Drittel

2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) Variante Pastushak: Prüfsumme = 668222; Elemente - 667065; Ausführungszeit = 65732 Mikrosekunden
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) Variante Korotky: Checksumme = 668222; Elemente - 667065; Ausführungszeit = 4757 Mikrosekunden
2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) Variante Fedoseev: Checksumme = 668222; Elemente - 667065; Ausführungszeit = 4815 Mikrosekunden
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) Variante Semko: Checksumme = 668222; Elemente - 667065; Ausführungszeit = 5812 Mikrosekunden
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) Variante Pavlov: Prüfsumme = 1001157; Elemente - 667065; Ausführungszeit = 0 Mikrosekunden
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) Variante Nikitin: Prüfsumme = 668222; Elemente - 667065; Ausführungszeit = 4749 Mikrosekunden
2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) Variante Vladimir: Checksumme = 668222; Elemente - 667065; Ausführungszeit = 9814 Mikrosekunden
Pawlow ist wieder abgestürzt.

Meine Schlussfolgerung zur Beschleunigung von for-Schleifen ist für MQL-Sprachen wahrscheinlich falsch.

Und die Erstellung eines zusätzlichen Arrays sollte die Dauer der Transaktion selbst verkürzen, indem die überflüssigen Arrays entfernt werden und das Array bis zum notwendigen Zeitpunkt seines Starts unverändert bleibt. Bislang war hier noch nicht die Rede von Datenerhalt.

 
Artyom Trishkin:

Was ist mit Peter? Hat er alle "aufgerissen"? Niemand hat seinen Code in den Checker eingegeben. Ich frage mich, wie und in welchem Ausmaß er alle im Vorstand umgehauen hat.

Aber es ist mir gelungen, Peters Version in die Finger zu bekommen.

int PeterArray(int &Arr[],const int val) // вариант Peter Konov
  {
   int deleted=0,q=0;
   for(int a1=0; a1<ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q]=Arr[q+deleted];
      if(Arr[q]==val){deleted++; q--;}
      q++;
     }
   ArrayResize(Arr,q);
   return (q);
  }

Es ist recht kompakt und funktioniert sogar richtig. Großes Lob an Pjotr.
Aber in Bezug auf die Geschwindigkeit ist er der zweitbeste von allen. Oder der erste Platz vom Ende her, wenn man die originale, völlig geschwindigkeitstechnisch ungeeignete Version des Besitzers dieses Threads nicht mitzählt.

2018.11.13 14:08:32.857 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 150492 микросекунд
2018.11.13 14:08:32.861 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 495882514; элементов - 999010; время выполнения = 2441 микросекунд
2018.11.13 14:08:32.865 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 495882514; элементов - 999010; время выполнения = 1852 микросекунд
2018.11.13 14:08:32.867 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 495882514; элементов - 999010; время выполнения = 779 микросекунд
2018.11.13 14:08:32.871 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 495882514; элементов - 999010; время выполнения = 2374 микросекунд
2018.11.13 14:08:32.876 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 495882514; элементов - 999010; время выполнения = 3720 микросекунд
2018.11.13 14:08:32.885 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 495882514; элементов - 999010; время выполнения = 7266 микросекунд
Dateien:
 

:-) wenn man nicht versucht, die Reihenfolge einzuhalten, ist die Zeit O(1) , die Gesamtzahl der Schritte aller Schleifen= Arraygröße

zu faul zum Programmieren :-)

1. suchen Sie die ersten 3 von links nach rechts.

2. wenn gefunden, dann von rechts nach links nach einer Nicht-Drei suchen, diese an die Stelle der 3 kopieren.

fortfahren, bis sich 1,2 überschnitten haben, das Feld um die Anzahl der Kopien kürzen.

Im Idealfall ist es genau 1/2 der"Blasensortierung" :-), wenn man statt zu kopieren einen Tausch vornimmt, ist die Ausgabe ein teilweise geordnetes Feld (alle 3 Drittel nach rechts verschoben)

 
Реter Konow:

Mehr Raffinesse:

Tut mir leid, man sagt, Sie seien ein guter Vermarkter, aber ein Programmierer... noch schlimmer als ich.

1. Die interne Integer-Variable ist nicht initialisiert, so dass sie Null sein wird, was aber nicht garantiert ist. In der Schleife wird die Rückwärtsverschiebung (beim ersten Mal) aus zwei Gründen gleichzeitig nicht stattfinden - raten Sie mal, aus welchem.

2. (am wichtigsten) Sie verschieben zuerst die Array-Elemente, dann erhöhen Sie den Wert der gelöschten Variablen, und dann gibt es eine Schleife, und die nächste Verschiebung wird eine mehr als notwendig geschehen. Mit anderen Worten: Ihr Code wird das ursprüngliche Array durcheinander bringen.

 
Extreme Optionen:
Es gibt keine zusätzlichen Elemente im Array:
2018.11.13 14:44:33.512 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 137515 микросекунд
2018.11.13 14:44:33.514 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1408 микросекунд
2018.11.13 14:44:33.517 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1807 микросекунд
2018.11.13 14:44:33.519 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 672 микросекунд
2018.11.13 14:44:33.522 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1433 микросекунд
2018.11.13 14:44:33.527 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 4025 микросекунд
2018.11.13 14:44:33.533 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 4297 микросекунд
Das Array enthält alle unnötigen Elemente:
2018.11.13 14:47:15.338 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 2000000000; элементов - 0; время выполнения = 2093 микросекунд
2018.11.13 14:47:15.341 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 0; элементов - 0; время выполнения = 2257 микросекунд
2018.11.13 14:47:15.343 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 0; элементов - 0; время выполнения = 1078 микросекунд
2018.11.13 14:47:15.345 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 0; элементов - 0; время выполнения = 665 микросекунд
2018.11.13 14:47:15.348 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 0; элементов - 0; время выполнения = 1580 микросекунд
2018.11.13 14:47:15.353 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 0; элементов - 0; время выполнения = 4064 микросекунд
2018.11.13 14:47:15.362 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 0; элементов - 0; время выполнения = 7982 микросекунд
Dateien:
 
Алексей Тарабанов:

Tut mir leid, man sagt, Sie seien ein guter Vermarkter, aber ein Programmierer... noch schlimmer als ich.


Alexej, du bringst ein junges Talent um...

dieser Vermarkter ist seit 5 Jahren nicht in der Lage, mit dem Verkauf zu beginnen... und Sie sagen, er sei ein noch schlechterer Programmierer :-)

Grund der Beschwerde: