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

 

Hier ist die beste Version, die die binäre Suche verwendet.

#include <Arrays\ArrayInt.mqh>
int array_filter(int &arr[], const int &filters[])
{
   int size_arr = ArraySize(arr);
   CArrayInt filterz;
   filterz.AssignArray(filters);
   filterz.Sort();
   int i=0, k=0;
   for(i=0; i<size_arr; i++)
      if(filterz.Search(arr[i]) < 0)
         arr[k++] = arr[i]; 
   return ArrayResize(arr, k); 
}


Ich spreche kein Russisch, ich benutze Google Translate.
 
jdjahfkahjf:

Er ist kein Russe, das ist schwer zu verstehen. El habla espanol.

Ich war versucht, Spanisch zu lernen, als ich dort auf der Durchreise war, aber irgendwie habe ich es aufgegeben ... vergeblich.
 
template<typename T>
int arrayFilter(T &data[], const T value)
{
     bool ser = ArrayGetAsSeries( data ) ? ArraySetAsSeries(data, false) : false;
   
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s && !IsStopped(); i++)
     {
          if( data[i] == value || data[i] == NULL )
          {
               result = true;
               s--;
               continue;
          }
          
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          if( ArrayResize(data, s) )
               if(ArraySize(data) == _s)
                    ArrayFill(data, s, _s-s, NULL);
     
     if( ser )
          ArraySetAsSeries(data, true);
     
     return s;
}

template<typename T>
int arrayFilter(T &data[], const T &value[])
{
     bool ser = ArrayGetAsSeries( data ) ? ArraySetAsSeries(data, false) : false;
   
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s && !IsStopped(); i++)
     {
          bool p = false;
          for(int y=0; y<ArraySize(value); y++)
               if( data[i] == value[y] )
               {
                    result = true;
                    s--;
                    p = true;
                    break;
               }
          if( p )
               continue;
          
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          if( ArrayResize(data, s) )
               if(ArraySize(data) == _s)
                    ArrayFill(data, s, _s-s, NULL);
     
     if( ser )
          ArraySetAsSeries(data, true);
     
     return s;
}

Je nachdem, wie Sie es brauchen, können Sie es am Ende beschaffen.

 
Konstantin Nikitin:

Je nachdem, wie Sie es brauchen, können Sie es am Ende beschaffen.

eine Kopie von value[], die bei der Eingabe der Funktion sortiert werden soll, und

die binäre Suche wird schneller sein, der Spanier ist hier richtig.

 
Maxim Kuznetsov:

eine Kopie von value[], die bei der Eingabe der Funktion sortiert werden soll, und

die binäre Suche wird schneller sein, da hat der Spanier recht.

Ich habe mich nicht darum gekümmert. Ich habe gerade eine schnelle Übertragung gemacht. Ja, und es kann String-Arrays geben.

P.S. Ich habe die Nase voll von dieser Unterhaltung. Es ist an der Zeit, zur Sache zu kommen.
 
Maxim Kuznetsov:

eine Kopie von value[], die bei der Eingabe der Funktion sortiert werden soll, und

die binäre Suche wird schneller sein, da hat der Spanier recht.

Ich würde HashSet Datenstruktur für Wert verwenden.
Die Komplexität wäre O(n) + O(m).

Für die vorgeschlagene binäre Suche wäre die Komplexität: O(n log(m))

 

24 Seiten - ich verstehe nicht, woher das Temperament kommt und wie viel man durch eine primitive Aufgabe gehen kann, nahm das Skript von der dritten Seite, da es keine Kraft gibt, weiter zu lesen, fügte drei Zeilen, Inline ohne Funktionen.

N=ArraySize(arr)-1;
for(int i=N;i>=0;i--) if(arr[i]==Value) arr[i]=arr[N--]; N++;
ArrayResize(arr,N);
2018.11.17 01:44:40.077 ArrayDeleteValue (EURUSD,H1)    вариант Pastushak: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 308973 микросекунд
2018.11.17 01:44:40.092 ArrayDeleteValue (EURUSD,H1)    вариант Korotky: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 11531 микросекунд
2018.11.17 01:44:40.107 ArrayDeleteValue (EURUSD,H1)    вариант Fedoseev: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 11325 микросекунд
2018.11.17 01:44:40.114 ArrayDeleteValue (EURUSD,H1)    вариант Semko: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 2819 микросекунд
2018.11.17 01:44:40.117 ArrayDeleteValue (EURUSD,H1)    вариант Inline: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 2600 микросекунд

es ist seltsam, aber es sieht so aus, als hätte er alle besiegt - "in fünf Minuten und ohne Tricks" (c) und ging ins Bett...))

Dateien:
 
Ivan Negreshniy:

24 Seiten - ich verstehe nicht, woher das Temperament kommt und wie viel man durch eine primitive Aufgabe gehen kann, nahm das Skript von der dritten Seite, da es keine Kraft gibt, weiter zu lesen, fügte drei Zeilen, Inline ohne Funktionen.

es ist seltsam, aber es sieht so aus, als hätte ich alle geschlagen - "in fünf Minuten und ohne Tricks" (c) und ging ins Bett...)))

1. Du hast Code von unbekanntem Alter genommen, und das ist eine direkte Respektlosigkeit gegenüber der Community;
2. Du hast Änderungen im Code gemacht, nagamno-coding irgendwo drinnen, ohne sie überhaupt in eine separate Funktion zu packen;
3. Dann hast du offensichtlich den Code für Leistungstests in DEBUG-Kompilierung gestartet, da sowohl die Ausführungsgeschwindigkeit als auch die Ergebnisse nicht der RELEASE-Version entsprechen.
4. Dein Code enthält Fehler und löst das Problem überhaupt nicht. (Daarr[N--] einenWert enthalten kann, der weder gefiltert noch gelöscht wurde).

Aber mit Pathos von solchen "Gewinnern"...

 

GUT. Solange es keine Arbeit gibt, geht der verrückte Test weiter. Ich habe einen neuen Vektortest hinzugefügt und gleichzeitig die Option von@Ivan Negreshniy aufgenommen, sehen Sie, korrigieren Sie Ihre Fehler, Ihr Algorithmus funktioniert nicht.

Wir haben das

1

Dateien:
 

Geringfügige Optimierung

P.S. Ich habe Fehler korrigiert und die Datei ersetzt

Dateien:
Grund der Beschwerde: