Biblioteca de classes genéricas - bugs, descrição, perguntas, recursos de uso e sugestões

 

Desde 6 de dezembro de 2017, a entrega padrão do MetaTrader 5 incluiu as chamadas classes genéricas que implementam algoritmos eficientes para armazenamento e recuperação de dados. Este tópico foi criado para descrever essas classes, exemplos de trabalho com elas e sugestões para melhorar seu trabalho.

O que é Generic? As classesGeneric são classes de modelo especiais que podem armazenar tipos de dados personalizados. A identificação do tipo é realizada no momento da compilação, o que resulta em alto desempenho.

Por que genérico? Em geral, os programadores iniciantes estão familiarizados com apenas um tipo de coleção: uma matriz. Mas há muitas tarefas em que trabalhar com uma matriz é ineficiente. Imagine que temos uma matriz composta por um milhão de identificadores exclusivos, por exemplo, mil pedidos. Como podemos verificar se nesse milhar de pedidos há um pedido com o número N? Se usarmos uma das classes genéricas, essa tarefa poderá ser executada quase instantaneamente, por um tempo constante, que não dependerá do número de elementos entre os quais a pesquisa será realizada. Há outras tarefas em que o algoritmo correto da coleção genérica pode ser mais rápido do que o algoritmo inventado por um programador.

Algoritmos genéricos. Abaixo está uma tabela de classes genéricas, com uma breve descrição do que elas fazem:

ClasseDescrição
CArrayList.Uma matriz, com repartição automática de tamanho. Permite que você tire proveito de uma matriz sem ter que controlar a saída dela.
CHashMapUm conjunto de valores-chave. Permite a inserção, a recuperação e a pesquisa eficientes de elementos por sua chave. A chave deve ser exclusiva. Por exemplo, o CHashMap pode localizar instantaneamente um pedido com um número especificado, em que o número é usado como chave.
CHashSetUm conjunto de elementos exclusivos. Permite fazer todas as mesmas coisas que o CHashMap, mas não exige uma chave. Os elementos armazenados nessa coleção não podem ser repetidos. Também permite a pesquisa, a recuperação e a adição instantâneas de um item.
CLinkedListUma lista duplamente vinculada. Permite a fácil inserção e exclusão de itens. Entretanto, leva um tempo linearmente dependente do número de itens na lista para encontrar o item desejado.
CQueueHeap. Organiza uma fila do tipo FIFO
CStackStack. Organiza uma fila do tipo LIFO
CRedBlackTreeRedBlackTree. Permite inserir elementos, extraí-los e localizá-los rapidamente (em tempo logarítmico). Ao contrário do CHashMap e do CHashSet, permite implementar com eficiência algoritmos de relação adicionais, como mais que, menos que, entre etc.
CSortedMapConjunto ordenado por chave. Armazena valores de valor-chave. Nesse caso, a chave é classificada.
CSortedSetUm conjunto ordenado por valor. Armazena um conjunto ordenado de valores.

Mais tarde, continuaremos e examinaremos os recursos de implementação dessas classes.

 
Vasiliy Sokolov:

Imagine que temos um conjunto de um milhão de identificadores únicos, por exemplo, mil pedidos. Como podemos verificar se existe uma encomenda com o número N naquele milhar de encomendas? Se utilizarmos uma das classes genéricas, esta tarefa pode ser realizada quase instantaneamente, num tempo constante, o que não depende do número de elementos que estamos a procurar.

Não estou nada familiarizado com o assunto. Mas o realçado parece ilógico.

 

Infelizmente, a biblioteca acabou de ser lançada e ainda está em bruto. Já encontrei o primeiro erro nele (vou destacar os erros por marcador):

Erro no CSortedSet:

//+------------------------------------------------------------------+
//| Class CSortedSet<T>.                                             |
//| Usage: Represents a collection of objects that is maintained in  |
//|        sorted order.                                             |
//+------------------------------------------------------------------+
template<typename T>
class CSortedSet: public ISet<T>
  {
   ...
   bool              TryGetMin(T &min)    { return(m_tree.TryGetMin(min)); }
   bool              TryGetMax(T &max)    { return(m_tree.TryGetMin(max)); }
   ...
  }

O método TryGetMax devolve o elemento mínimo em vez do máximo, assim como o TryGetMin

 
fxsaber:

... Mas o realçado parece ilógico.

Porquê?

 
Vasiliy Sokolov:

Porquê?

Fazendo hashes, ordenando-os em ordem ascendente. Mas haverá uma busca em qualquer caso.

 
fxsaber:

Não estou nada familiarizado com o assunto. Mas o realçado parece ilógico.

tempo médio O(1) pior O(n) e o desempenho é altamente dependente do haxixe.
 
fxsaber:

Fazer hashes ...

Vamos definir a terminologia. Nada é instantâneo. Qualquer operação leva tempo. Quando digo instantâneo, estou a simplificá-lo para que os programadores novatos me entendam. A rigor, há várias classes de complexidade, as principais com as quais vamos lidar são as seguintes:

  • CO(1) complexidade constante.
  • Logarítmico: cO(log n).
  • Linear: cO (n).
  • Algoritmos que requerem tempo de execução não-linear.

Eu introduzi deliberadamente um sinal c - como uma espécie de constante que ocorre ao calcular o hash e outras manipulações técnicas. Mas neste caso, a discussão sobre otimizaçãoc constante está fora do tópico deste tópico. Estamos interessados aqui apenas em aulas genéricas e na sua aplicação na prática.

 
fxsaber:

Fazer hashes, ordená-los em ordem ascendente. Mas vai haver uma busca de qualquer maneira.

Combinador:
A média de tempo O(1) pior O(n) e desempenho é altamente dependente do hash.

+

p.s. Para ilustrar, aqui está um exemplo onde este mesmo desempenho irá cair para O(n) se você não lidar corretamente com o CHashMap.

 

Sugiro simplificar os nomes - torná-los mais lógicos. Por exemplo, a CArrayList é um Array ou List em mql5 uma implementação de ambos?

Tudo isto leva a perguntas e confusão. IMHO, devemos usar stl e não C# ou Java. Ou então remova C na frente, que seja apenas a ArrayList.


Se você fizer nomes normais:

- a legibilidade vai aumentar muitas vezes.

- você terá seu próprio estilo específico de mql5.

- os principiantes poderão navegar imediatamente pelo código (porque o stl está incluído no padrão)

 
Vasiliy Sokolov:

...

Se você puder dar exemplos, por exemplo, sobre a busca entre milhares de negócios.
Razão: