Discusión sobre el artículo "Fundamentos de programación en MQL5 - Listas"

 

Artículo publicado Fundamentos de programación en MQL5 - Listas:

La nueva versión del lenguaje MQL5 ha proporcionado al programador que trabaja en los proyectos de sistemas automáticos de trading las eficaces herramientas para la implementación de complejas tareas. No se puede negar el hecho de que las capacidades de programación del lenguaje han sido ampliadas considerablemente. ¡La presencia de los recursos de la programación orientada a objetos (POO) en MQL5 ya vale bastante! Es más, no podemos olvidar mencionar la Librería estándar. A juzgar por la presencia del error con el código 359, muy pronto aparecerán las plantillas de las clases.

En este artículo me gustaría abordar el tema que puede ser de alguna manera la ampliación o continuación de los temas que describen los tipos de datos y sus conjuntos. Aquí, voy a hacer referencia a un artículo publicado en la web de MQL5.community. La descripción muy detallada y sistémica de los principios y la lógica del trabajo con los arrays ha sido propuesta por Dmitry Fedoseev (Integer) en su artículo «Fundamentos de programación en MQL5 - Arrays».

Bien, hoy propongo ocuparnos de las listas, o para ser más exacto de las listas enlazadas lineales. Empezaremos con la estructura, propósito y lógica de la construcción de la lista. Luego veremos las herramientas que ofrece la Librería estándar referentes a nuestro tema. A continuación, les mostraré los ejemplos de aplicación de las listas en su trabajo con el lenguaje MQL5.

Fig. 1 Nodes in a singly linked list
Fig. 1 Nodes in a singly linked list

Autor: Dennis Kirichenko

 

Gracias al autor por este magnífico artículo.

 
Кроме узла для односвязного списка есть ещё другие. Пожалуй, самым популярным является узел для двусвязного списка.

una idea incompleta.

Por lo tanto, las capacidades de un nodo para una lista doblemente enlazada serán similares a las de un nodo uni-enlazado, excepto que todavía necesita manejar un puntero al nodo anterior.

¿Es necesario procesar un puntero al nodo anterior para tener las capacidades de un nodo de enlace simple? El autor ha captado el punto que quería transmitir, pero la redacción en sí no es muy buena.....

Fig.3 Nodos de una lista bilinked en anillo

1) el puntero superior - la flecha está un poco torcida

2) Me doy cuenta de que puede ser el estilo de los artículos - pero la descripción de la figura está en letra muy pequeña y bastante tenue (opinión personal de mala vista).

También necesitaremos un nodo de este tipo que sirva a las necesidades de una lista doblemente enlazada . Se diferencia de la formaanterior en que contiene otro puntero que hace referencia al nodoanterior . Y naturalmente, dicho nodo del elemento cabeza de la lista será igual a NULL.

1) De laforma anterior- ¿de qué? ¿Cuánto anterior? Por qué debo buscar que por anterior el autor quiere decir "Nodo de una lista de un solo enlace", o tal vez estoy equivocado.

2) "elnodo del elemento cabeza de la lista será igual a NULL". ¿Nodo o puntero?Quizá en vista de la afirmación anterior "En una lista se pueden almacenar nodos, no elementos", sería más correcto decir

"uno de los punteros del nodo cabeza deuna lista doblemente enlazadaserá igual a NULL ".

Pero en el nodo de cola, el enlace al siguiente nodo no estará vacío, porque se rellenará con el puntero de cabeza.

1) no habrá referencia - no habrá quién-qué ???? los casos no se mantienen

2) Pero en el nodo de cola, no habrá referencia al siguiente vacío (quién-qué ????). pensamiento inacabado

3) Se llenará (la referencia) con un índice. ¿Se llenará el enlace con el puntero, o el puntero seguirá teniendo una referencia en alguna parte ????.

En cuanto a las operaciones de borrado, casi duplican las similares del grupo add:

  • borrar el nodo cabeza;
  • eliminar el nodo de cola;
  • eliminar un nodo del lugar especificado en la lista;
  • destructor.

1) prácticamente duplican las similares (quién-qué ????) del grupo add. De nuevo un pensamiento incompleto

2) ¿borrar un nodo de un lugar especificado de la lista no es un caso general de "borrar el nodo cabeza" y "borrar el nodo cola"??? de forma similar para add

3)"Con respecto a las operaciones de eliminación", y antes de eso era "Los siguientes pueden ser considerados como métodos de adición:" ( allí métodos, aquí operaciones - quiero el mismo formato).

Esto es así, una opinión personal sobre la parte introductoria de un ignorante, para el que se crean estas mismas partes introductorias del artículo.

 
Me ha gustado. Gracias. Es bueno cuando después de leerlo sacas ideas donde puedes aplicarlo en tu propio lugar. )
 
tol64:
Me ha gustado. Gracias. Es bueno cuando después de leerlo sacas ideas donde puedes aplicarlo en tu propio lugar. )
tol64, gracias por la opinión autorizada :-)
 
2ALXIMIKS: aún no has leído literatura de programación... En general, por tu parte es fastidioso....
 
denkir:
tol64, gracias por la opinión de un experto con autoridad :-)
No me considero un especialista y tampoco una autoridad. Y no es por modestia, sino de verdad. ))) Aquí hay programadores muchas veces más expertos en programación, matemáticas y trading. Y yo todavía tengo que nadar y nadar. )))
 
tol64:
No me considero un experto y tampoco una autoridad. Y no es por modestia, de verdad. ))) Aquí hay programadores muchas veces más expertos en programación, matemáticas y trading. Y yo todavía tengo que nadar y nadar. )))

Creo que la autoridad es algo subjetivo. Es como el reconocimiento de la soberanía de un país por parte de otro....

Cito:

La autoridad consiste en el reconocimiento del sujeto (portador) de logros sobresalientes, conocimientos, destrezas, habilidades, su posición especial en la sociedad...

Así que yo reconozco la tuya :-)

tol64, esperamos tus nuevos artículos.

Авторитет — Википедия
  • ru.wikipedia.org
Авторитет (нем.  , от лат.   — «власть, влияние») — в общем смысле: значение и основанная на значении или с ним соединённая власть; в узком — влияние умственное, побуждающее уважение, доставляемое обладанием превосходной и признанной власти или выдающейся и признанной мудрости, знания, добродетели. Влияние индивида, основанное на занимаемом им...
 
En el siguiente bloque (Ejemplo 4) sugiero prestar atención a una de las principales desventajas de un contenedor de datos como una lista: la velocidad de acceso a los elementos. La cuestión es que el acceso a los elementos de la lista es lineal, а в случае со списочным классом CList - бинарно, что немного уменьшает трудоёмкость алгоритма.
En la búsqueda lineal tenemos intensidad de trabajo de la forma O(N), y en la búsqueda binaria - log2(N).
Con la búsqueda lineal tenemos intensidad de trabajo de la forma O(N), y con la binaria - log2(N).

He aquí un código de este tipo para un ejemplo de acceso a los elementos del conjunto de datos:


¿Dónde has encontrado un acceso binario a los elementos de CList con complejidad log2(N)?

CList es una lista, y el acceso binario con complejidad log2(N) requiere un salto momentáneo a un nodo con índice CurrentIndex +/- (CurrentIndex/2), donde CurrentIndex es el nodo actual de la lista.

La implementación de CList utiliza la función estándar QuickSearch(), que en el caso de la ordenación busca un elemento haciendo referencia al nodo CurrentIndex +/- (CurrentIndex/2). Sin embargo, este nodo es buscado por la función GetNodeAtIndex(), y no hay milagros en ello. Toda la complejidad de la operación de acceso recae sobre ella, concretamente sobre estas cadenas:

if(revers)
     {
      //--- buscar de derecha a izquierda
      for(;i>index;i--)
        {
         result=result.Prev();
         if(result==NULL)
            return(NULL);
        }
     }
   else
     {
      //--- buscar de izquierda a derecha
      for(;i<index;i++)
        {
         result=result.Next();
         if(result==NULL)
            return(NULL);
        }
     }

Mirándolas, queda claro que la complejidad de buscar un elemento es O(N/2) en el límite, porque la lista es bidireccional, así que el acceso a un elemento desde uno de los extremos no superará N/2 transiciones. El autor haría bien en entender el algoritmo más a fondo antes de escribir un artículo sobre él.

Por experiencia propia puedo decir que, dado que el trabajo con datos casi siempre está relacionado con la búsqueda y ordenación de los mismos, casi siempre es ineficiente utilizar la clásica CList para tareas reales. List es fuerte sobre todo en colecciones combinadas, donde el acceso por índice se combina con el acceso por lista.

Por alguna razón, poca gente piensa en el hecho de que una transición por puntero es mucho, mucho más lenta que el direccionamiento directo por índice. Recorrer result.Next() mil veces es mucho más lento que recorrer el índice mil veces en for.

 
denkir:

Un coma.

Empezando por las imágenes. El puntero va al nodo, no a los datos, los datos son sólo una parte del nodo, es decir, hay un conflicto con la implementación y una posible confusión.

El texto es mayormente normal, para ser justos.

Sobre la implementación. Estas cosas se implementan mediante plantillas. La variante óptima de representación de contenedores en STL, aunque aquí con iteradores y functores es un fracaso, aunque probablemente se te ocurra algo.

Como resultado, sus métodos virtuales vacíos parecen no sólo incomprensible, pero sólo vryviglaz. El ) hoja de clasificación ha entregado. La implementación e incluso la declaración de algunos métodos es cuestionable e incluso desconcertante.

Cero encapsulación.

Revelaciones sobre la complejidad y la búsqueda binaria(!) en la lista(! gg) terminado.

Como resultado, tenemos una actual TODO incomprensible e inconveniente mierda, no utilizable incluso como un ejemplo para el aprendizaje (imho).

Sin ofender ) si quieres ser programador aprende a programar NORMALMENTE. Serás capaz de aplicarlo mucho mejor.

C-4:

Mirándolas, se ve enseguida que la complejidad de encontrar un elemento está en el límite O(N/2), porque la lista es bidireccional, así que acceder a un elemento desde un extremo no superará N/2 transiciones. El autor haría bien en entender el algoritmo más a fondo antes de escribir un artículo sobre él.

También haría bien en refrescar la memoria, lo que es O, escrito arriba está, en primer lugar, mal calculado, y en segundo lugar, mal escrito.

_____________________________________

Lo más interesante es que este no es ni mucho menos el peor artículo de recursos.

 
TheXpert:

...

No te ofendas ) si quieres ser programador aprende a programar NORMALMENTE. Usted es capaz de darse cuenta mucho mejor.

Usted también haría bien en refrescar la memoria, lo que es O, escrito anteriormente es, en primer lugar incorrectamente calculado, en segundo lugar incorrectamente escrito.

...

Deseo lo mismo para usted. Mira y obtendrá en una cohorte de los elegidos)).