Algoritmi, metodi di soluzione, confronto delle loro prestazioni - pagina 18

 
Реter Konow:
Perché una soluzione perfetta a un problema particolare è percepita come una presa in giro? Seriamente, non capisco...

Qual era il suo compito? Ricordatevelo qui pubblicamente per favore.

 
Vasiliy Sokolov:

Lei ha scritto delle sciocchezze. Essenzialmente una variante dell'accesso a un array per il suo indice. In realtà i numeri delle transazioni sono casuali, e tutto il tuo esempio crollerà quando dovrai risolvere il problema reale.


Aspettate di farlo bene, di sicuro domani.

 
Реter Konow:

***

Se dovessi fare in modo che i dati non spariscano da un array quando la sua dimensione viene cambiata, ***

Ecco un controllo per gli array dinamici:arr_dynamic unidimensionale earr_dynamic_multi bidimensionale.

//+------------------------------------------------------------------+
//|                                                  ArrayResize.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объявим динамические массивы
   double arr_dynamic[];
   double arr_dynamic_multi[][2];
//--- новый размер в первом измерении массива
   if(ArrayResize(arr_dynamic,5)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,5)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }

   for(int i=0;i<ArraySize(arr_dynamic);i++)
      arr_dynamic[i]=i;
   for(int i=0;i<ArrayRange(arr_dynamic_multi,0);i++)
     {
      arr_dynamic_multi[i][0]=i;
      arr_dynamic_multi[i][1]=i*10;
     }

//--- распечатка значений до увеличения размера
   Print("Перед ArrayResize массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("Перед ArrayResize массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);

//--- увеличим размер на два элемента
   if(ArrayResize(arr_dynamic,ArraySize(arr_dynamic)+2)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,ArrayRange(arr_dynamic_multi,0)+2)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }
//--- распечатка значений после увеличения размера
   Print("После ArrayResize (увеличения размера) массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("После ArrayResize (увеличения размера) массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);

//--- новый размер в первом измерении массива установим равным 3 (то есть уменьшим размер массива)
   if(ArrayResize(arr_dynamic,3)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,3)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }
//--- распечатка значений после уменьшение размера
   Print("После ArrayResize (уменьшение размера) массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("После ArrayResize (уменьшение размера) массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);
  }
//+------------------------------------------------------------------+


Come potete vedere, quando si aumenta la dimensione dell'array, i valori precedenti rimangono:

Перед ArrayResize массив "arr_dynamic" имеет такие элементы:
0.00000 1.00000 2.00000 3.00000 4.00000
Перед ArrayResize массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]  0.00000  0.00000
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
[3,]  3.00000 30.00000
[4,]  4.00000 40.00000
После ArrayResize (увеличения размера) массив "arr_dynamic" имеет такие элементы:
  0.00000   1.00000   2.00000   3.00000   4.00000  -0.00000  +0.00000
После ArrayResize (увеличения размера) массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]  0.00000  0.00000
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
[3,]  3.00000 30.00000
[4,]  4.00000 40.00000
[5,] +0.00000 +0.00000
[6,] +0.00000 +0.00000
После ArrayResize (уменьшение размера) массив "arr_dynamic" имеет такие элементы:
0.00000 1.00000 2.00000
После ArrayResize (уменьшение размера) массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]  0.00000  0.00000
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
File:
 
Vasiliy Sokolov:

Lei ha scritto delle sciocchezze. Essenzialmente una variante dell'accesso a un array per il suo indice. In realtà i numeri delle transazioni sono casuali, e tutto il tuo esempio crollerà quando dovrai risolvere un problema reale.

Ti riferisci ai biglietti, immagino. Intendo numeri di transazione sequenziali.

Potete fare una serie parallela l'una accanto all'altra per registrare i biglietti.

O diversi array paralleli per registrare il resto dei dati di ogni ordine.

 
Vladimir Karputov:

Ecco un controllo per gli array dinamici:arr_dynamic unidimensionale earr_dynamic_multi bidimensionale.


Come potete vedere , quando la dimensione dell'array viene aumentata, i valori precedenti rimangono:


nasconderlo qui puramente OOP e tutto ciò che è utile

 
Vladimir Karputov:

Ecco un controllo per gli array dinamici:arr_dynamic unidimensionale earr_dynamic_multi bidimensionale.


Come potete vedere , se aumentate la dimensione dell'array, i valori precedenti rimangono:

Grazie. Questa è un'informazione molto preziosa.
 

Vorrei discutere di Print and Comment - perché nessuno sta prestando attenzione

 
Vasiliy Sokolov:

C'è una proprietà magica: Capacity, che tra l'altro è assente in CHashMap per qualche motivo (che è una grossolana svista degli sviluppatori). Specificandolo, bypassiamo il re-partitioning. Potete specificarlo in questo compito, quindi non vedo alcun problema.

È possibile specificare lacapacità in CHashMap tramite il costruttore.

Vasiliy Sokolov:

Perché hanno fattori di scala diversi, a proposito, è anche molto strano. È difficile riorganizzare CHashMap rispetto alla più semplice CArrayList.

Per CHashMap la dimensione del dizionario dovrebbe essere un numero semplice per mantenere l'uniformità degli hash nel dizionario.
CHashMap usa CPrimeGenerator per scegliere i numeri primi.
Ma sfortunatamente, l'implementazione di CPrimeGenerator non soddisfa le aspettative e contiene solo i valori sottostanti:

const static int  CPrimeGenerator::s_primes[]=
  {
   3,7,11,17,23,29,37,47,59,71,89,107,131,163,197,239,293,353,431,521,631,761,919,
   1103,1327,1597,1931,2333,2801,3371,4049,4861,5839,7013,8419,10103,12143,14591,
   17519,21023,25229,30293,36353,43627,52361,62851,75431,90523,108631,130363,156437,
   187751,225307,270371,324449,389357,467237,560689,672827,807403,968897,1162687,1395263,
   1674319,2009191,2411033,2893249,3471899,4166287,4999559,5999471,7199369
  };
Il fattore di crescita medio è dell'ordine dell'1,2
 
Vasiliy Sokolov:

Qual era il suo compito? Ricordatevelo qui pubblicamente per favore.

Trovare la soluzione più veloce ed efficiente per aggiungere meg a un array (lista, dizionario...), e recuperare meg da un array per numero di transazione, quando il numero di transazioni future è sconosciuto.

 
Реter Konow:

Trovare la soluzione più veloce ed efficiente per aggiungere meg a un array (lista, dizionario...), e recuperare meg dall'array, con un numero sconosciuto di transazioni future.


comprensibilmente, non si è parlato di un biglietto

Tuttavia, vi consiglio di iniziare a complicare il vostro codice con ogni sorta di cose come funzioni boilerplate
Motivazione: