Bibliothèque de classes génériques - bogues, description, questions, caractéristiques d'utilisation et suggestions - page 18
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Exécutez ceci
et j'ai obtenu ceci.
CArrayList est plus rapide que la variante de hachage. Je suis entré dans les entrailles de CArrayList, et il y a ceci
Je me sens trompé maintenant. CArrayList s'est avéré être une enveloppe pour un tableau habituel. Je pensais que c'était une liste normale avec des pointeurs Prev/Next, mais cela ressemble à ceci
Outre les algorithmes de travail avec les structures elles-mêmes, il y a aussi le problème du choix du bon conteneur en fonction des spécificités de la tâche.
L'interface peut donc être la même pour différentes implémentations. Une certaine déception, non pas à cause de l'interface, mais de l'implémentation spécifique - le tableau. Comparé au hachis, c'est le paradis et la terre.
Je me sens trompé maintenant. CArrayList s'est avéré être une enveloppe pour un tableau normal. Je pensais que c'était une liste normale avec des pointeurs Prev/Next, mais voilà
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie
Algorithmes, méthodes de résolution, comparaison des performances
Sergey Dzyublik, 2017.12.10 20:52
Quel genre de SGBD, que dites-vous à un homme qui ne connaît rien auxstructures de données.
S'il n'y a pas de concept de ArrayList (vecteur du C++), de quoi pouvons-nous parler ici......
C'est plus votre inattention ici...
Lire toute la liste disponible -https://www.mql5.com/ru/docs/standardlibrary/generic
CArrayList est un analogue de std::vector du C++.
CLinkedList est très probablement un analogue de std::list du C++.
Exécutez ceci
et j'ai obtenu ceci.
CArrayList est plus rapide que la variante de hachage. Je suis entré dans les entrailles de CArrayList, et il y a ceci
Je me sens trompé maintenant. CArrayList s'est avéré être une enveloppe pour un tableau habituel. Je pensais que c'était une liste normale avec des pointeurs Prev/Next mais cela ressemblait à ceci
Historiquement, List n'est pas du tout une feuille - c'est un tableau. Donc, c'est bon. Si vous obtenez une liste en générique, elle sera probablement appelée LinkedList ou quelque chose comme ça.
Une certaine frustration, non pas avec l'interface, mais avec l'implémentation spécifique - le tableau.
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading
Bibliothèque de classes génériques - bugs, description, questions, particularités d'utilisation et suggestions
Sergey Dzyublik, 2017.12.09 01:12
Il y a quelques suggestions d'améliorations possibles :
1) À mon humble avis, l'implémentation contient un choix de capacité pas tout à fait correct - à la fois la taille initiale 3 et les suivantes lors de la reconstruction de la table de hachage.
Oui, il est exact qu'un nombre premier doit être choisi pour l'uniformité de la distribution.
Cependant, l'implémentation de CPrimeGenerator ne répond pas aux attentes et contient des omissions de nombres premiers.
L'objectif d'un tel "générateur" est clair : fournir un facteur d'incrémentation de l'ordre de 1,2 avec la génération automatique de nombres premiers.
Toutefois, ce coefficient n'est-il pas trop faible ? En C++ pour les vecteurs, le coefficient est généralement de 1,5 à 2,0, selon la bibliothèque (car il affecte fortement la complexité moyenne de l'opération).
La solution pourrait être un coefficient constant suivi d'un arrondi au nombre premier via une recherche binaire d'une liste de nombres premiers.
Et une taille initiale de 3 est trop petite, nous ne vivons pas au siècle dernier.
2) Actuellement, la table de hachage est reconstruite (Redimensionnement) uniquement lorsque la capacité est remplie à 100% (toutes les m_entries[] sont remplies).
De ce fait, il peut y avoir un nombre important de collisions pour les clés qui ne sont pas distribuées de manière très uniforme.
En option, envisagez d'introduire un facteur de remplissage, qui réduirait de 100 % la limite nécessaire à la reconstruction de la table de hachage.
1) Le facteur de croissance du volume (capacité) n'est pas égal à 1,2, la méthode CPrimeGenerator::ExpandPrime est utilisée pour calculer le nouveau volume dans CHashMap :
Dans cette méthode, l'ancienne taille de la collection est multipliée par deux, puis nous trouvons le nombre simple le plus proche du sommet pour la valeur résultante et le retournons comme nouveau volume.
Concernant la valeur initiale de la capacité - je suis d'accord, elle est très faible.
Mais d'un autre côté, il y a toujours des constructeurs, où vous pouvez spécifier explicitement la capacité initiale :
Je ne vois donc pas l'intérêt de changer quoi que ce soit ici.
2) L'ajout d'un paramètre de facteur de remplissage permettrait vraiment d'éviter les collisions dans certains cas. Le plus susceptible d'être mis en œuvre.
1) Le coefficient de capacité n'est pas égal à 1,2, pour calculer le nouveau volume dans CHashMap, on utilise la méthode CPrimeGenerator::ExpandPrime :
Dans cette méthode, l'ancienne taille de la collection est multipliée par deux, puis pour la valeur résultante, nous trouvons le nombre premier le plus proche du sommet et le renvoyons comme nouveau volume.
Concernant la valeur initiale de la capacité - je suis d'accord, elle est très faible.
Mais d'un autre côté, il y a toujours des constructeurs, où vous pouvez spécifier explicitement la capacité initiale :
C'est pourquoi je ne vois pas de raison de changer quelque chose ici.
2) L'ajout du paramètre de facteur de remplissage permettra vraiment d'éviter les collisions dans certains cas. Il est fort probable qu'elle sera mise en œuvre.
Roman, je crois que tu as mal compris. Maintenant, certaines classes ne contiennent même pas les méthodes les plus nécessaires. Avez-vous déjà essayé de les utiliser ? Prenez CRedBlackTree, par exemple, l'implémentation classique d'un arbre rouge-noir. Algorithme plutôt cool mais sans la possibilité d'itération. Qu'est-ce que vous entendez par là ? Il y a beaucoup d'autres choses dont vous pourriez avoir besoin mais que personne n'a pris la peine de mettre en œuvre pour une raison quelconque. Le truc GetHashCode est horrible. Désolé, mais ce n'est pas au niveau de MQ !
Roman, je ne pense pas que tu fasses la bonne chose là. Or, certaines classes génériques ne contiennent même pas les méthodes les plus nécessaires. Avez-vous essayé de les utiliser ? Prenez par exemple CRedBlackTree - une implémentation classique d'un arbre rouge-noir. Algorithme plutôt cool mais sans la possibilité d'itération. Qu'est-ce que vous entendez par là ? Il y a beaucoup d'autres choses dont vous pourriez avoir besoin mais que personne n'a pris la peine de mettre en œuvre pour une raison quelconque. Le truc GetHashCode est horrible. Désolé, mais ce n'est pas le niveau de MQ !
Je suis bien conscient du besoin d'itérateurs pour toutes les collections de modèles de la bibliothèque Genric, mais sans la possibilité de créer des classes imbriquées et l'héritage multiple des interfaces, vous ne pouvez pas les mettre en œuvre correctement.
J'aimerais entendre des commentaires plus spécifiques sur GetHashCode.
...
Quant à GetHashCode, j'aimerais entendre des remarques plus précises.
Problème
De toute évidence, GetHashCode ne peut pas être mis en œuvre correctement dans un environnement MQL5 personnalisé. En effet, tous les objets ne sont pas accessibles. Et si l'implémentation fonctionne bien pour les membres primitifs comme double int, pour les objets complexes (classes, structures et même énumérations) le hachage est calculé par nom. Si nous avons des milliers de CObjects ou même ENUM_something_that, alors CHashMap et CHashSet dégénéreront en LinkedList :
Nous ne pouvons pas éviter cela car tout ce que nous avons au niveau de l'utilisateur est le nom de l'objet :
Par conséquent, les hachages de tous les objets de types complexes sont égaux les uns aux autres et le code de recherche implique ici une énumération complète des tableaux :
En fait, c'est tellement important que cela va à l'encontre de l'intérêt d'utiliser tous les génériques à la racine. Le fait est que, dans la plupart des cas, vous devez associer ou stocker des objets complexes : énumérations, structures ou classes. Si vous deviez opérer uniquement avec des types simples, vous pourriez vous contenter de quelque chose de plus simple.
Solution
De toute évidence, MQL5 est un langage de programmation personnalisé à sécurité intrinsèque fonctionnant dans une machine virtuelle interne. Quelque chose comme Net. Cela signifie que l'accès nécessaire aux objets existe toujours, mais à un niveau plus systémique. D'où,peut-être écrire la fonction système GetHashCode avec le prochain prototype :
Comment cela doit-il fonctionner ? Tout d'abord, il doit être omnivore et rapide. Il devrait donner une distribution uniforme. Par exemple :
Cette fonction pourrait être située dans la section des fonctions du système. Je ne vois pas d'autres solutions.
Je ferai d'autres suggestions concernant les interfaces, l'héritage multiple et d'autres aspects de l'héritage C++ un peu plus tard.