Algoritmos, métodos de solución, comparación de su rendimiento - página 18

 
Реter Konow:
¿Por qué una solución perfecta a un problema concreto se percibe como una burla? En serio, no entiendo...

¿Cuál era su tarea? Recuérdelo usted mismo aquí públicamente, por favor.

 
Vasiliy Sokolov:

Has escrito un disparate. Esencialmente es una variante del acceso a un array por su índice. En realidad los números de las transacciones son aleatorios, y todo tu ejemplo se derrumbará cuando tengas que resolver el problema real.


Espera a que lo hagas bien, seguro que mañana.

 
Реter Konow:

***

Si tuviera que asegurarse de que los datos no desaparecen de un array cuando se cambia su tamaño, ***

Aquí hay una comprobación de las matrices dinámicas:arr_dynamic unidimensional yarr_dynamic_multi bidimensional.

//+------------------------------------------------------------------+
//|                                                  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);
  }
//+------------------------------------------------------------------+


Como puedes ver, cuando el array aumenta de tamaño, los valores anteriores se mantienen:

Перед 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
Archivos adjuntos:
 
Vasiliy Sokolov:

Has escrito un disparate. Esencialmente es una variante del acceso a un array por su índice. En realidad, los números de las transacciones son aleatorios, y todo tu ejemplo se derrumbará cuando tengas que resolver un problema real.

Supongo que se refiere a las entradas. Me refiero a los números de transacción secuenciales.

Puedes hacer una matriz paralela al lado de la otra para registrar las entradas.

O varias matrices paralelas para registrar el resto de los datos de cada pedido.

 
Vladimir Karputov:

Aquí hay una comprobación de las matrices dinámicas:arr_dynamic unidimensional yarr_dynamic_multi bidimensional.


Como puedes ver , cuando se aumenta el tamaño del array, los valores anteriores se mantienen:


esconderlo aquí puramente OOP y todo útil

 
Vladimir Karputov:

Aquí hay una comprobación de las matrices dinámicas:arr_dynamic unidimensional yarr_dynamic_multi bidimensional.


Como puedes ver , si aumentas el tamaño del array, los valores anteriores se mantienen:

Gracias. Es una información muy valiosa.
 

Me gustaría debatir sobre la impresión y los comentarios: por qué nadie presta atención

 
Vasiliy Sokolov:

Hay una propiedad mágica: Capacidad, que por cierto está ausente en CHashMap por alguna razón (lo cual es un grave descuido de los desarrolladores). Al especificarlo, evitamos la re-partición. Puedes especificarlo en esta tarea, así que no veo ningún problema.

Puede especificar lacapacidad en CHashMap a través del constructor.

Vasiliy Sokolov:

Por cierto, también es muy extraño el motivo por el que tienen diferentes factores de escala. Es más difícil reordenar un CHashMap que un CArrayList más sencillo.

Para CHashMap el tamaño del diccionario debe ser un número simple para mantener la uniformidad de los hashes en el diccionario.
CHashMap utiliza CPrimeGenerator para elegir los números primos.
Pero lamentablemente, la implementación de CPrimeGenerator no cumple con las expectativas y sólo contiene los valores que se indican a continuación:

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
  };
El factor de crecimiento medio es del orden del 1,2
 
Vasiliy Sokolov:

¿Cuál era su tarea? Recuérdelo usted mismo aquí públicamente, por favor.

Encontrar la solución más rápida y eficiente para añadir megas a un array (lista, diccionario...), y recuperar megas de un array por número de transacción, cuando el número de transacciones futuras es desconocido.

 
Реter Konow:

Encontrar la solución más rápida y eficiente para añadir megas a un array (lista, diccionario...), y recuperar megas del array, con un número desconocido de transacciones futuras.


comprensiblemente, no se trataba de una multa

Aun así, te aconsejo que empieces a complicar tu código con todo tipo de cosas como funciones boilerplate