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

 

Vergleichen Sie die 2 Code-Varianten für dieselbe ToR:

//+------------------------------------------------------------------+
//|                                             Erase and Resize.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int Arr[20] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2};
   ulong q1 = GetMicrosecondCount(); 
   //--------------------------------
   int deleted = 0,q = 0;
   //-------------- 
   for(int a1 = 0; a1 < ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q] = Arr[q + deleted];
      if(Arr[q] == 3){deleted++; q--;}
      q++;
     }
   //--------------
   ulong q2 = GetMicrosecondCount(); 
   //--------------------------------
   //ArrayResize(Arr, ArraySize(Arr) - deleted);    
   //--------------------------------
   Print(Arr[0],",",Arr[1],",",Arr[2],",",Arr[3],",",Arr[4],",",Arr[5],",",Arr[6],",",Arr[7],",",Arr[8],",",Arr[9],
        ",",Arr[10],",",Arr[11],",",Arr[12],",",Arr[13],",",Arr[14],",",Arr[15],",",Arr[16],",",Arr[17],",",Arr[18],",",Arr[19]);
   Print("Array new size  ",ArraySize(Arr),"  Тime of operation  ",q2-q1,"  deleted  ",deleted);
   //--------------------------------  
  }
//+------------------------------------------------------------------+

и:

int Arr[20] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2};
int deleted;
//-------------- 
for(int a1 = 0; a1 < ArraySize(Arr); a1++)
  {
   if(Arr[a1] == 3)
     {
      if(deleted)a1-= deleted;//Cмещение назад.
      deleted++; 
     }
   if(deleted)Arr[a1] = Arr[a1 + deleted];
  }
//-------------- 
ArrayResize(Arr, ArraySize(Arr) - deleted);
Könnte dies von ein und derselben Person geschrieben worden sein, die nur etwas mehr als eine Stunde auseinander liegt? Die Handschrift ist fragwürdig )
 
Maxim Kuznetsov:

Alexej, du tötest junge Talente...

Dieser Vermarkter ist seit 5 Jahren nicht mehr in der Lage, etwas zu verkaufen... und Sie sagen, er sei ein noch schlechterer Programmierer

Tut mir leid, ich wollte dich nicht umbringen.

 
Maxim Kuznetsov:

:-) wenn man nicht versucht, die Reihenfolge einzuhalten, ist die ZeitO(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 Sie statt des Kopierens eine Vertauschung vornehmen, wird die Ausgabe ein teilweise geordnetes Array sein (alle 3 Drittel nach rechts verschoben)

Die Gesamtzahl der Schritte aller Schleifen=Arraygröße ist O(n)-Komplexität.
Wenn das Eingabefeld sortiert ist, wird das gegebene Problem durch binäre Suche gelöst.
Die Komplexität ist O(log(n)) im durchschnittlichen Fall und O(n) im schlechtesten Fall.

 
Es ist schon schlimm genug, wenn man zu faul zum Programmieren ist.
 
Nikolai Semko:

Ich habe immer noch den Dreh raus bei Peters Version.

Es ist ziemlich kompakt und funktioniert sogar richtig. Großes Lob an Peter.
Aber in Bezug auf die Geschwindigkeit kommt es erst an zweiter Stelle. Oder den ersten Platz vom Ende her, wenn man das Original nicht mitzählt, das durch die Geschwindigkeitsvariante des Besitzers dieses Threads völlig unbrauchbar ist.

Wie haben Sie es getestet?

 
Das, was du geworfen hast, ist keine Option, das letzte. Man muss es sowieso übertreiben.
 
Реter Konow:

Wie haben Sie die Tests durchgeführt?

Studieren Sie den Code.

2018.11.14 03:26:49.182 ArrayDeleteValue (BTCUSD,M15)   вариант Pastushak: Контрольная сумма = 496575839; элементов - 998974; время выполнения = 131158 микросекунд
2018.11.14 03:26:49.185 ArrayDeleteValue (BTCUSD,M15)   вариант Korotky:   Контрольная сумма = 496575839; элементов - 998974; время выполнения = 2431 микросекунд
2018.11.14 03:26:49.188 ArrayDeleteValue (BTCUSD,M15)   вариант Fedoseev:  Контрольная сумма = 496575839; элементов - 998974; время выполнения = 1809 микросекунд
2018.11.14 03:26:49.190 ArrayDeleteValue (BTCUSD,M15)   вариант Semko:     Контрольная сумма = 496575839; элементов - 998974; время выполнения = 785 микросекунд
2018.11.14 03:26:49.194 ArrayDeleteValue (BTCUSD,M15)   вариант Pavlov:    Контрольная сумма = 496575839; элементов - 998974; время выполнения = 2839 микросекунд
2018.11.14 03:26:49.199 ArrayDeleteValue (BTCUSD,M15)   вариант Nikitin:   Контрольная сумма = 496575839; элементов - 997971; время выполнения = 4049 микросекунд
2018.11.14 03:26:49.204 ArrayDeleteValue (BTCUSD,M15)   вариант Vladimir:  Контрольная сумма = 496575839; элементов - 998974; время выполнения = 3888 микросекунд
2018.11.14 03:26:49.212 ArrayDeleteValue (BTCUSD,M15)   вариант Peter:     Контрольная сумма = 496575839; элементов - 998974; время выполнения = 7597 микросекунд
Dateien:
 
Алексей Тарабанов:
Es ist schlimm, wenn man zu faul zum Programmieren ist.

Nicht, dass ich faul wäre, aber MT gibt es nur auf VDS, und auf diesen experimentiert man nicht.

darüber:

template <typename T>
int arrayFilter(const  T &arr[], const T x)
{
        int i=0;
        int j=ArraySize(arr)-1;
        for(;;) {
                while(arr[i]!=x && i<j) i++;
                while(arr[j]==x && i<j) j--;
                if (i<j) {
                        arr[i++]=arr[j--];
                } else break;
        }
        ArrayResize(j+1);
        return j+1;
}

+- 1 :-) Ich bin in ein paar Tagen aus dem Ferienlager zurück, ich werde es mir ansehen...

ps. außerdem gibt es im Code einen zusätzlichen Schleifeneintrag bei Beendigung... eine Kleinigkeit, aber sie kann entfernt werden

 
Maxim Kuznetsov:

Nicht, dass ich faul wäre, aber MT gibt es nur auf VDS, und auf diesen experimentiert man nicht.

darüber:

+- 1 :-) Ich komme in ein paar Tagen vom Lande zurück, ich werde es mir ansehen...

ps. zusätzlich, in den Code zusätzliche Eingabe in die Schleife am Ende...eine Kleinigkeit, aber kann entfernt werden

Bravo! Nachdem ich ein paar Fehler korrigiert habe, haben Sie mich vom Sockel gestoßen, auch ohne ArrayCopy zu benutzen. Schachmatt. :))

template <typename T>
int arrayFilter3(T &arr[], const T x)  // вариан Kuznetsov
{
        int i=0;
        int j=ArraySize(arr)-1;
        for(;;) {
                while(arr[i]!=x && i<j) i++;
                while(arr[j]==x && i<j) j--;
                if (i<j) {
                        arr[i++]=arr[j--];
                } else break;
        }
        ArrayResize(arr,j+1);
        return j+1;
}
2018.11.14 03:48:29.572 ArrayDeleteValue (USDRUB,M1)    вариант Pastushak: Контрольная сумма = 496206996; элементов - 999002; время выполнения = 131929 микросекунд
2018.11.14 03:48:29.576 ArrayDeleteValue (USDRUB,M1)    вариант Korotky:   Контрольная сумма = 496206996; элементов - 999002; время выполнения = 2411 микросекунд
2018.11.14 03:48:29.579 ArrayDeleteValue (USDRUB,M1)    вариант Fedoseev:  Контрольная сумма = 496206996; элементов - 999002; время выполнения = 1839 микросекунд
2018.11.14 03:48:29.581 ArrayDeleteValue (USDRUB,M1)    вариант Semko:     Контрольная сумма = 496206996; элементов - 999002; время выполнения = 782 микросекунд
2018.11.14 03:48:29.585 ArrayDeleteValue (USDRUB,M1)    вариант Pavlov:    Контрольная сумма = 496206996; элементов - 999002; время выполнения = 2813 микросекунд
2018.11.14 03:48:29.590 ArrayDeleteValue (USDRUB,M1)    вариант Nikitin:   Контрольная сумма = 496206996; элементов - 997969; время выполнения = 4200 микросекунд
2018.11.14 03:48:29.596 ArrayDeleteValue (USDRUB,M1)    вариант Vladimir:  Контрольная сумма = 496206996; элементов - 999002; время выполнения = 3597 микросекунд
2018.11.14 03:48:29.604 ArrayDeleteValue (USDRUB,M1)    вариант Peter:     Контрольная сумма = 496206996; элементов - 999002; время выполнения = 7684 микросекунд
2018.11.14 03:48:29.606 ArrayDeleteValue (USDRUB,M1)    вариант Kuznetsov: Контрольная сумма = 496206996; элементов - 999002; время выполнения = 681 микросекунд
Dateien:
 
Nikolai Semko:

Bravo! Nachdem ich ein paar Fehler korrigiert habe, haben Sie mich vom Sockel gestoßen, auch ohne ArrayCopy zu verwenden. Schachmatt. :))

Obwohl das nicht ganz stimmt, denn das Ausgangsfeld ist ganz anders, nämlich bereits gemischt. Aber es ist trotzdem cool!

Wenn es sich um Zitate handelt, funktioniert das natürlich nicht. Ich stehe wieder auf dem Podium. ))

Ich habe die Art und Weise, wie die Prüfsumme berechnet wird, geändert. Es handelt sich nicht mehr um die einfache Summe aller Elemente, sondern um die Summe (Elementwert)/(Elementnummer).
Und das ist es, was ich bekommen habe:

2018.11.14 04:20:26.063 ArrayDeleteValue (USDRUB,M1)    вариант Pastushak: Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 132291 микросекунд
2018.11.14 04:20:26.067 ArrayDeleteValue (USDRUB,M1)    вариант Korotky:   Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 2322 микросекунд
2018.11.14 04:20:26.071 ArrayDeleteValue (USDRUB,M1)    вариант Fedoseev:  Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 1831 микросекунд
2018.11.14 04:20:26.074 ArrayDeleteValue (USDRUB,M1)    вариант Semko:     Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 773 микросекунд
2018.11.14 04:20:26.079 ArrayDeleteValue (USDRUB,M1)    вариант Pavlov:    Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 2879 микросекунд
2018.11.14 04:20:26.085 ArrayDeleteValue (USDRUB,M1)    вариант Nikitin:   Контрольная сумма = 7093.903216084301; элементов - 998017; время выполнения = 3605 микросекунд
2018.11.14 04:20:26.090 ArrayDeleteValue (USDRUB,M1)    вариант Vladimir:  Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 3622 микросекунд
2018.11.14 04:20:26.100 ArrayDeleteValue (USDRUB,M1)    вариант Peter:     Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 7252 микросекунд
2018.11.14 04:20:26.102 ArrayDeleteValue (USDRUB,M1)    вариант Kuznetsov: Контрольная сумма = 7085.49357433088;  элементов - 999003; время выполнения = 691 микросекунд
Dateien: