Cancellare un array di elementi definiti - pagina 12

 
Alexey Viktorov:

Quindi, se un ordine viene chiuso, deve essere "cancellato" dall'array. In questi casi, ero solito copiare l'array "in se stesso" e ridurre la dimensione di uno.

In tal caso, scriverei un biglietto inesistente nell'array -1 , aspetterei che tutti gli ordini siano stati chiusi e cancellerei l'intero array (la dimensione dell'array dovrebbe essere impostata a 1).

In questo approccio, un elemento dell'array di biglietti (se non c'è un ordine) viene controllato con una sola condizione: if(ArrayOfTicket[i] > 0) .....

imho, è più veloce che "scuotere" costantemente l'array

 
Igor Makanu:

In questo caso, scriverei un biglietto inesistente nell'array -1, aspetterei che tutti gli ordini fossero chiusi e cancellerei l'intero array (dimensione dell'array = 1).

In questo approccio, un elemento dell'array di biglietti (se non c'è un ordine) viene controllato con una sola condizione: if(ArrayOfTicket[i] > 0) .....

imho, è più veloce che "scuotere" costantemente l'array

Non capisco... Che differenza fa se cancellare elemento per elemento o controllare gli indici di ordini inesistenti... l'array è scosso comunque...

Comunque, come hanno detto oggi al telegiornale, è impossibile brevettare il sapore. I floureshers sono diversi solo nel colore, ma hanno tutti lo stesso sapore.

 
Alexey Viktorov:

Non capisco... Che differenza fa se vuoi cancellare gli elementi uno per uno o controllare gli indici di ordini inesistenti... L'array viene superato comunque...

Comunque, come hanno detto oggi al telegiornale, è impossibile brevettare il sapore. I floureshers sono diversi solo nel colore, ma hanno tutti lo stesso sapore.

Cancellare un elemento implica copiare i restanti elementi dell'array, non cancello elementi dell'array, contrassegno elementi non esistenti (biglietti) con il valore -1, e cancello un array di biglietti quando non ci sono ordini di mercato

Per quanto riguarda i marcatori di galleggiamento, è sicuramente vero, dipende dal problema, in linea di principio, ci sono di solito 2 soluzioni durante l'ottimizzazione:

- o aggiungere complessità all'algoritmo, ma risparmiare memoria e risorse di calcolo del PC

- o semplificare l'algoritmo e risparmiare risorse di calcolo ma sprecare memoria

 

Il checksum non è corretto, se c'è 0 nell'array potrebbe esserci un errore

La variante di Nikitin funziona proprio su un errore del genere.

File:
456.mq5  20 kb
 
Vladimir Pastushak:

Il checksum non è corretto, se c'è 0 nell'array potrebbe esserci un errore

La variante di Nikitin funziona proprio per un tale errore.

Sì, hai ragione. Solo Nikitin ha inoltre buttato fuori zero elementi. Ecco perché il suo codice sembrava difettoso. In realtà si trattava di risolvere il compito che si era prefissato all'inizio.
Se documentate il suo controllo degli elementi nulli, il risultato è lo stesso:

2018.11.14 13:50:34.481 ArrayDeleteValue (BTCUSD,M15)   вариант Pastushak: Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 133765 микросекунд
2018.11.14 13:50:34.486 ArrayDeleteValue (BTCUSD,M15)   вариант Korotky:   Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 2330 микросекунд
2018.11.14 13:50:34.489 ArrayDeleteValue (BTCUSD,M15)   вариант Fedoseev:  Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 1840 микросекунд
2018.11.14 13:50:34.492 ArrayDeleteValue (BTCUSD,M15)   вариант Semko:     Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 777 микросекунд
2018.11.14 13:50:34.497 ArrayDeleteValue (BTCUSD,M15)   вариант Pavlov:    Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 2818 микросекунд
2018.11.14 13:50:34.503 ArrayDeleteValue (BTCUSD,M15)   вариант Nikitin:   Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 3922 микросекунд
2018.11.14 13:50:34.510 ArrayDeleteValue (BTCUSD,M15)   вариант Vladimir:  Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 4239 микросекунд
2018.11.14 13:50:34.519 ArrayDeleteValue (BTCUSD,M15)   вариант Peter:     Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 7307 микросекунд
2018.11.14 13:50:34.522 ArrayDeleteValue (BTCUSD,M15)   вариант Kuznetsov: Контрольная сумма = 7185.677992388435; элементов - 998993; время выполнения = 683 микросекунд

Di nuovo, il checksum ora tiene conto dell'ordine degli elementi, prima non lo faceva.

File:
 
Oh, lascia perdere. Sto finendo la mia birra. Avrò ~25 litri pronti per Capodanno. Ecco di cosa si sta parlando.
 
Nikolai Semko:

Sì, hai ragione. Solo che Nikitin lanciava anche altri elementi nulli. Ecco perché il suo codice sembrava sbagliato. In realtà si trattava di risolvere il compito che si era prefissato all'inizio.
Se documentate il suo controllo degli elementi nulli, il risultato è lo stesso:

Di nuovo, il checksum ora tiene conto dell'ordine degli elementi, prima non lo faceva.

A proposito, se l'ordine è molto importante, potete aggiungere ArraySort alla fine della mia variante e vedere quanto sia efficace ArraySort.

 

Ora mi interessa un'altra domanda, alla quale non riesco a trovare una risposta.
Forse qualcuno può spiegare perché questa variante dal codice di Kuznetsov:

    for(;;)
     {
      while(arr[i]!=x && i<j) i++;
      while(arr[j]==x && i<j) j--;
      if(i<j)
        {
         arr[i++]=arr[j--];
        }
      else break;
     }

funziona più del doppio più velocemente di questo, che fa esattamente la stessa cosa:

   while(i<j)
     {
      if(arr[i]==x)
         if(arr[j]!=x) arr[i++]=arr[j--];
      else j--;
      else i++;
     }

Quali sono le meraviglie del compilatore?
È possibile che per un tale disegno:

while(arr[i]!=x && i<j) i++;

il compilatore trova qualche comando speciale di ricerca dell'assemblatore per il processore?
Qualcuno è forte nei comandi dei processori moderni?

 
Maxim Kuznetsov:

A proposito, se l'ordine è molto importante, posso aggiungere ArraySort alla fine della mia versione, allo stesso tempo vediamo quanto è efficace ArraySort.

L'ho provato. È una funzione abbastanza costosa. Però è più facile da buttare via dopo. Tutti quelli necessari vanno in fila.


Nikolai Semko:

Sì, hai ragione. Solo Nikitin lanciava oggetti nulli in aggiunta. Ecco perché il suo codice sembrava sbagliato. In realtà era il compito che avevi definito all'inizio.
Se documentate il suo controllo per gli elementi nulli, il risultato è lo stesso:

Quasi ogni funzione può essere adattata ad essa. Ecco il mio ultimo (che era puramente sperimentale, ma sembra essere uno dei meno costosi).
template<typename T>
int arrayFilter(T &data[],const T value=NULL)
  {
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s; i++)
     {
          if( data[i] == value || data[i] == NULL )
          {
               result = true;
               s--;
               continue;
          }
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          ArrayResize(data, s);
     
     return s;
  }
 
Nikolai Semko:

:

funziona più del doppio più velocemente di uno che fa esattamente la stessa cosa:


l'ottimizzatore è irrilevante - i confronti sono meno della metà...