Algoritmos, métodos de solução, comparação de seu desempenho - página 18

 
Реter Konow:
Por que uma solução perfeita para um problema específico é percebido como uma zombaria? Sério, eu não entendo...

Qual foi sua tarefa? Lembre-o aqui publicamente, por favor.

 
Vasiliy Sokolov:

Você escreveu alguns disparates. Essencialmente uma variante de acesso a uma matriz por seu índice. Na realidade, os números das transações são aleatórios, e todo o seu exemplo entrará em colapso quando você precisar resolver o problema real.


Espere até que você acerte, tenho certeza de que amanhã.

 
Реter Konow:

***

Se eu tivesse a certeza de que os dados não desaparecessem de uma matriz quando seu tamanho fosse alterado, ***

Aqui está uma verificação para arrays dinâmicos:arr_dinâmico unidimensional e bidimensionalarr_dinâmico_multi.

//+------------------------------------------------------------------+
//|                                                  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 você pode ver, quando a matriz é aumentada em tamanho, os valores anteriores permanecem:

Перед 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
Arquivos anexados:
 
Vasiliy Sokolov:

Você escreveu alguns disparates. Essencialmente uma variante de acesso a uma matriz por seu índice. Na realidade, os números das transações são aleatórios, e todo o seu exemplo entrará em colapso quando você precisar resolver um problema real.

Você está se referindo a ingressos, eu acho. Refiro-me aos números seqüenciais das transações.

Você pode fazer uma matriz paralela ao lado um do outro para registrar as passagens.

Ou várias matrizes paralelas para registrar o resto dos dados de cada pedido.

 
Vladimir Karputov:

Aqui está uma verificação para arrays dinâmicos:arr_dinâmico unidimensional e bidimensionalarr_dinâmico_multi.


Como você pode ver , quando o tamanho da matriz é aumentado, os valores anteriores permanecem:


esconder aqui puramente OOP e tudo o que é útil

 
Vladimir Karputov:

Aqui está uma verificação para arrays dinâmicos:arr_dinâmico unidimensional e bidimensionalarr_dinâmico_multi.


Como você pode ver , se você aumentar o tamanho da matriz, os valores anteriores permanecem:

Obrigado. Esta é uma informação muito valiosa.
 

Eu gostaria de discutir Imprimir e Comentar - por que ninguém está prestando atenção

 
Vasiliy Sokolov:

Existe uma propriedade mágica: a capacidade, que por sinal está ausente no CHashMap por alguma razão (que é uma supervisão grosseira dos desenvolvedores). Ao especificá-lo, contornamos o re-particionamento. Você pode especificá-lo nesta tarefa, portanto não vejo nenhum problema.

Você pode especificar acapacidade em CHashMap via construtor.

Vasiliy Sokolov:

Por que eles têm fatores de escala diferentes, a propósito, também é muito estranho. É difícil rearranjar o CHashMap do que uma CArrayList mais simples.

Para CHashMap, o tamanho do dicionário deve ser um número simples para manter a uniformidade dos hashes no dicionário.
CHashMap utiliza o CPrimeGenerator para a escolha dos números primos.
Mas infelizmente, a implementação do CPrimeGenerator não atende às expectativas e contém apenas os valores abaixo:

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
  };
O fator de crescimento médio é da ordem de 1,2
 
Vasiliy Sokolov:

Qual foi sua tarefa? Lembre-o aqui publicamente, por favor.

Encontrar a solução mais rápida e eficiente para adicionar megas a uma matriz (lista, dicionário...), e recuperar megas de uma matriz por número de transação, quando o número de transações futuras for desconhecido.

 
Реter Konow:

Encontre a solução mais rápida e eficiente para adicionar megas a uma matriz (lista, dicionário...) e recuperar megas da matriz, com um número desconhecido de transações futuras.


compreensivelmente, não se tratava de um bilhete

Ainda assim, aconselho você a começar a complicar seu código com todos os tipos de coisas como funções de placa de caldeira