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

 
Vladimir Pastushak:

Die Hauptaufgabe besteht darin, das Array der definierten Werte zu löschen.

Dies kann nicht die Hauptaufgabe sein. Was wird in diesem Feld gesammelt und wie wird es dann verwendet?

 
Stanislav Korotky:

Nun, das ist nicht ernst gemeint. Wenn ich Elefanten ziehe, um dieses spezielle kleine Problem zu lösen, würde ich STL::remove(array, value) erwähnen.

Das ist einfach sehr ernst und grundlegend. MQL ist einfach langatmig. Schrecklich sogar.

Grundlegende Operatoren wie filter (was ist das in TC, filtern), map (abbilden), fold (zusammenlegen, zusammenfassen)
sollten sofort umgesetzt werden, ohne Fragen zu stellen. Und optimiert werden.

 
Maxim Kuznetsov:

Das ist einfach sehr ernst und grundlegend. MQL ist einfach langatmig. Es ist furchtbar.

Solche grundlegenden Operatoren wie Filter (in TC ist das Filtern), Map (Abbildung), Fold (Summierung)
sollten sofort und ohne Fragen implementiert werden. Und optimiert werden.

Der Punkt ist, dass es unsinnig ist, für eine kleine Aufgabe eine so große ("grundlegende") Abhängigkeit zu schaffen. Wenn alles klug zu schreiben und refactor das gesamte Projekt - dann, natürlich, aber es ist nicht das Wesen der ursprünglichen Frage.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bereinigung eines Arrays von bestimmten Elementen

Dmitry Fedoseev, 2018.11.12 23:05

void DelEl(double & a[],double v){
   int sz=ArraySize(a);
   for(int i=sz-1;i>=0;i--){
      if(a[i]==v){
         sz--;
         for(int j=i;j<sz;j++){
            a[j]=a[j+1];
         }
      }
   }
   ArrayResize(a,sz);
}


Das ist eine Art Schande...©

1. Der Vergleich von Variablen des Typs double über == ist, gelinde gesagt, nicht komisch;
2. Die Komplexität des Codes ist O(n^2), und die schlechteste Komplexität für dieses Problem mit einer unsortierten Eingabesequenz sollte O(n) sein;
3. Der Code funktioniert nicht, denn wenn die Funktion tatsächlich verwendet wird, kann nicht festgestellt werden, wie viele gültige Werte das zurückgegebene Array enthält:

void DelEl(double & a[],double v){
   int sz=ArraySize(a);
   for(int i=sz-1;i>=0;i--){
      if(a[i]==v){
         sz--;
         for(int j=i;j<sz;j++){
            a[j]=a[j+1];
         }
      }
   }
   ArrayResize(a,sz);
}


int OnStart(){
   double arr[] = {3, 5, 5, 3, 3, 5, 5, 3};
   double v = 3;
   
   ArrayPrint(arr);
   DelEl(arr, v);
   ArrayPrint(arr);
   
   return INIT_SUCCEEDED;
}


Ergebnis der Ausführung:

2018.11.13 00:35:33.355 Test123 (EURUSD,H1)     3.00000 5.00000 5.00000 3.00000 3.00000 5.00000 5.00000 3.00000
2018.11.13 00:37:08.495 Test123 (EURUSD,H1)     5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 3.00000

Die ungültigen Werte sind rot hervorgehoben, sie wurden nie aus dem Array entfernt.

 
Sergey Dzyublik:


Das ist eine Art Schande...©

1. Es ist nicht schön, Variablen vom Typ double mit == zu vergleichen, um es milde auszudrücken;
2. Die Code-Komplexität ist O(n^2), und die Worst-Case-Komplexität für dieses Problem mit einer unsortierten Eingabesequenz sollte O(n) sein;
3. Der Code funktioniert nicht, denn wenn die Funktion tatsächlich verwendet wird, kann nicht festgestellt werden, wie viele gültige Werte das zurückgegebene Array enthält:


Ergebnis der Ausführung:

Ungültige Werte, die nie aus dem Array entfernt wurden, sind rot hervorgehoben.

Jublik? So soll es sein. Der Vergleich von Variablen des Typs double ist ziemlich komisch, wenn sie vor dem Vergleich nicht berechnet werden.

Lernen Sie Rechnen. Was ist mit Scham?

 
Sergey Dzyublik:


Das ist eine Art Schande...©

1. Der Vergleich von Variablen des Typs double mit == ist, gelinde ausgedrückt, nicht komisch;
2. Die Codekomplexität ist O(n^2), und die schlechteste Komplexität für dieses Problem mit unsortierter Eingabesequenz sollte O(n) sein;
3. Der Code funktioniert nicht, denn wenn die Funktion tatsächlich verwendet wird, kann nicht festgestellt werden, wie viele gültige Werte das zurückgegebene Array enthält:


Ergebnis der Ausführung:

Ungültige Werte, die nie aus dem Array entfernt wurden, sind rot hervorgehoben.

Seien Sie nicht albern. Soll ich Ihnen Ihren Fehler erklären, oder können Sie ihn selbst erraten? Überhaupt nicht schwierig...

Drei Punkte, drei Korridore. Nein, eigentlich sind es nur zwei Paddocks.

ps, aber ich habe Vertrauen in Sie.

ps2 Hier ist das Ergebnis, wenn Sie die Funktion richtig verwenden:


 

Das ist schon besser:

void DelEl2(double & a[],double v){
   int sz=ArraySize(a);
   int i=0;   
   int j=0;
   for(;i<sz;i++){ 
      if(a[i]!=v){
         a[j]=a[i];
         j++;
      }
   }
   ArrayResize(a,j);
}
 
Dmitry Fedoseev:

Das ist schon besser:

Dimitri, lass mich dich aufrütteln - v ist auch ein Array.

Und überhaupt, das ist alles ein Haufen Unsinn.

 
Алексей Тарабанов:

Dimitri, lass mich dich beruhigen - v ist auch ein Array.

Und ganz allgemein ist das alles völliger Unsinn.

Wenn v ein Array ist, ist das kein Problem. Wahrscheinlicher ist jedoch die Tatsache, dass es sich um Unsinn handelt. Ich habe nie das Bedürfnis verspürt, diese Aufgabe zu lösen.

 

Wenn es so ein Schnelligkeitswettbewerb ist, werde ich auch meine eigene Variante anbieten:

int ArrayDeleteVal(int &a[],const int val) // вариант Semko
  {
   int size=ArraySize(a);
   int i=0,start,s,count;
   while(i<size && a[i]!=val) i++; // ищем первый элемент массива со значением val
   start=i; i++;
   while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
   s=i; i++;
   while(true)
     {
      while(i<size && a[i]!=val) i++; // ищем элемент массива со значением val
      count=i-s;
      if(count>6) { ArrayCopy(a,a,start,s,count); start+=count;} // если нужно скопировать более 6 элементов, то имеет смысл воспользоваться ArrayCopy
      else for(; s<i; start++,s++) a[start]=a[s];                // иначе простой цикл
      if(i==size) break;
      i++;
      while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
      if(i<size) s=i; else break;
      i++;
     }
   if(start<size) ArrayResize(a,start); else start=size;
   return(start);
  }

Ich habe ein Testskript für alle Varianten geschrieben.
Hier ist das Ergebnis für ein Array mit 1 000 000 Elementen (etwa 1000 zusätzliche Werte):

2018.11.12 19:50:02.965 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 156457 микросекунд
2018.11.12 19:50:02.969 ArrayDeleteValue (EURUSD,D1)    вариант Korotky: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 2319 микросекунд
2018.11.12 19:50:02.972 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 1810 микросекунд
2018.11.12 19:50:02.974 ArrayDeleteValue (EURUSD,D1)    вариант Semko: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 785 микросекунд
Wer ist der Nächste? :))
Peter, Awww....
Dateien: