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

 
Реter Konow:

Esta é uma proposta interessante e útil. Manutenção de registros paralelos. Fiz isso em minhas outras soluções.

A única coisa que não sabemos é o número de pedidos que serão feitos pelo Consultor Especialista. Que tamanho devemos definir para a série int?

Foi por isso que decidi pegar a corda.


Você estabelece uma margem de 100 elementos e adiciona 100 elementos de cada vez. O String tem a mesma implementação

 
Alexandr Andreev:

Eu não consegui encontrar o arquivogenérico, parece ser uma construção antiga. Então, como será fornecido o princípio de navegação - qual é o código fonte?

https://www.mql5.com/ru/forum/221917

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2017.12.07
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 
Vasiliy Sokolov:

Peter, existe uma grande função chamada ArrayResize(). Ele permite aumentar o tamanho de uma matriz em tempo de execução.

Como opção, eu estava pensando sobre isso.

1. Eu duvidava do ponto de vista da velocidade.

2. Do ponto de vista do código - mais linhas e mais confusão.

Quando a matriz é redimensionada, os dados desaparecem dela (se não estou enganado).

Portanto, eles têm que ser armazenados em outra matriz que também deve ser incrementada.

Isto resulta na reescrita para frente e para trás, que mencionei anteriormente.

 
Реter Konow:

Como uma opção - pense nisso.

1. Em termos de velocidade - questionado.

2. Do ponto de vista do código - mais linhas e mais confusão.

Quando a matriz é redimensionada, os dados desaparecem dela (se não estou enganado).

Portanto, eles têm de ser reservados em outra série, que também tem de ser aumentada.

Você recebe as reescritas que eu estava falando antes.


Não, eles não.

 
Alexandr Andreev:

Não, eles não.

Você tem certeza?
 
Реter Konow:
Você tem certeza?

Sim. Os dados não desaparecem.

 
Реter Konow:
Você tem certeza?


template<typename T> 
   void ArrayAdd(T &m[], T& a)    {m[ArrayResize(m,ArraySize(m)+1,100)-1)]=a;}

na verdade, é a linha.... que está causando todo o alvoroço. Tudo o resto é trivial.

O princípio é o mesmo na folha, mas embalado em uma classe.
 
Реter Konow:

2. Em termos de código - mais linhas e mais confusão.

   #include <Generic\ArrayList.mqh>

   CArrayList<int> collection;
   
   int value_set = 1;
   collection.Add(value_set);
 
   int index = 0;
   int value_get = -1; 
   collection.TryGetValue(index,value_get); 


Como é confuso, quanto esforço é necessário para ler......
Sua solução é 100% mais bonita, mais elegante e mais rápida.

 

Uma solução aproximada sobre o CHashMap:

//+------------------------------------------------------------------+
//|                                                RandomTickets.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#include <Generic\HashMap.mqh>
input int RandomDeals = 24000;
CHashMap<int, int> MagicsByDeals;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   for(int i = 0; i < RandomDeals; i++)
      MagicsByDeals.Add(MathRand(), MathRand());
   MagicsByDeals.Add(1337, MathRand());
   ulong msec = GetMicrosecondCount();
   bool res = MagicsByDeals.ContainsKey(1337);
   string t = (string)(GetMicrosecondCount()-msec);
   printf("Время выполнения запроса: " + t + " микросекунд");
   if(res)
      printf("Сдлека с номером 1337 была удачно найдена");
   else
      printf("Сдлека с номером 1337 не найдено");
}
//+------------------------------------------------------------------+
 
Alexandr Andreev:

na verdade, é a linha.... que está causando todo o alvoroço. Tudo o resto é trivial.

em uma folha, o princípio de adicionar é o mesmo apenas embalado em uma classe


Parece ter sido encontrada a variante perfeita. Peço a todos que verifiquem isso.

Se eu tivesse certeza de que os dados não desapareceriam da matriz quando ela fosse redimensionada, a solução seria esta:

//+------------------------------------------------------------------+
//|                                                      Magic 2.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
int    All_magics[];
int    order_number;
int    Random_orders_of_strategy;
//+------------------------------------------------------------------+
void Save_magic(int magic)
{
 order_number++;
 //---------------------------------
 //Записываем каждый магик вместе с порядковым номером ордера.
 //---------------------------------
 ArrayResize(All_magics,order_number);
 All_magics[order_number - 1] = magic;
 //---------------------------------
}
//+------------------------------------------------------------------+
void Trading()
{
 Random_orders_of_strategy = MathRand();
 //----------------------------------------
 //Имитируем открытие неопределенного количества ордеров стратегии.
 //----------------------------------------
 for(int a1 =  0; a1 < Random_orders_of_strategy; a1++)
   {
    int this_magic = MathRand();
    //----------------------------
    Save_magic(this_magic);
    //----------------------------
   }
 //----------------------------------------
}
//+------------------------------------------------------------------+
int Get_magic(int deal_number)
{
 return(All_magics[deal_number - 1]);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Trading();
   //--------------------------
   ulong t1 = GetMicrosecondCount();
   Get_magic(1000);
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   Print("Время исполнения функции Get_magic() при количестве ордеров ",Random_orders_of_strategy," равно ",t2 - t1);
   //--------------------------
   Print("Random_orders_of_strategy  ",Random_orders_of_strategy);
   Print("magic 1:  ",Get_magic(1),"  magic 2: ",Get_magic(2),"  magic 3: ",Get_magic(3));
   
  }
//+------------------------------------------------------------------+
Razão: