文章 "MQL5 编程基础:列表"

 

新文章 MQL5 编程基础:列表已发布:

MQL 语言的新版本向自动交易系统的开发人员提供实施复杂任务的有效工具。不可否认,语言的编程能力已经得到极大的扩展。MQL5 面向对象的编程功能尤其值得一提。此外,也不能忽视标准库。通过错误代码 359 来判断,将很快支持类模板。

在本文中,我将通过描述数据类型和它们的集合来介绍什么在某种形式上可能是本文主题的扩展或延续。在这里,我要引用一篇在 MQL5.community 网站上发布的文章。Dmitry Fedoseev (Integer) 在他的 "MQL5 Programming Basics:Arrays"(MQL5 编程基础:数组)一文中极为详细且全面地描述了使用数组的原则和逻辑。

因此,今天我将转向列表,更加确切地说,转向线性链表。我们将从列表结构、含义及逻辑开始。之后,我们将探讨已经包含在标准库中的相关工具。最后,我将提供一个在使用 MQL5 时如何运用列表的例子。

Fig. 1 Nodes in a singly linked list

作者:Dennis Kirichenko

 

感谢作者的精彩文章!

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

这是个不完整的概念。

因此,双链表节点的功能与单链表节点的功能类似,只是仍需要处理指向前一个节点的指针。

是否需要处理 指向前一个节点的指针才能拥有单链节点的功能?作者已经表达了他想表达的意思,但措辞本身不是很好.....。

图 3 环状双链路列表的节点

1) 最上面的指针--箭头有点歪

2)我知道这可能是文章的风格--但图中的描述字体非常小,而且比较暗个人认为视力不好)

我们还需要这样一个节点来满足双链表的需要。 与前一种 形式的 不同之处在于,它持有另一个指针,该指针指向前一个 节点当然,这样一个 节点 的表头元素 将等于 NULL

1)从上一个表单-- 从什么表单? 有多少上一个表单?我为什么要搜索作者所说的前一个节点是指 "单链表的节点",也许我错了。

2) " 列表头部元素 的节点等于NULL"。 节点,还是指针?也许考虑到前面提到的 "可以在列表中存储节点,而不是元素",更正确的说法应该是:"列表 头部元素的 一个指针等于NULL":

"双链路列表 头部节点的 一个 指针等于 NULL"

但在尾部节点中,指向下一个节点的链接 不会是空的,因为它将被 头部指针填满

1) 不会有引用 - 不会有 谁是谁 ????情况不成立

2) 但在尾部节点中,没有 指向下一个空(who-what ????)的引用未完成的思考

3)它(引用)将由索引填充。 该链接是由指针填充,还是指针在某处仍有引用 ?????

至于删除操作,它们几乎与添加组中的 类似 操作 重复

  • 删除头部节点
  • 删除尾节点
  • 从列表的指定位置删除节点;
  • 析构函数。

1)它们几乎 重复了 添加组中的类似 who-what????) 操作 这又是一个不完整的想法

2)从指定的列表位置 删除一个节点不"删除头部节点 "和 "删除尾部节点 "的一般情况吗?

3)"关于 删除操作 ",而在此之前是 "下列操作 可视为添加方法:"(这里是方法, 这里是操作 --我希望格式相同)。

这就是一个无知的人对导言部分的个人看法,文章的导言部分就是为他而设的。

 
我很喜欢。谢谢。读完之后,你会有一些想法,可以在自己的地方应用,这很好。)
 
tol64:
我很喜欢。谢谢。读完之后,你会有一些想法,可以在自己的地方应用,这很好。)
tol64, 感谢您的权威意见:-)
 
2ALXIMIKS: 你还没读过编程文献... 总的来说, 从你的角度来看,这是唠叨....
 
denkir:
tol64, 感谢权威专家的意见 :-)
我不认为自己是专家,也不认为自己是权威。这不是谦虚,而是真的如此。)))这里的程序员在编程、数学和交易方面的经验比我丰富得多。而我还得游啊游。)))
 
tol64:
我不认为自己是专家,也不认为自己是权威。这不是因为谦虚,真的是这样。)))这里的程序员在编程、数学和交易方面的经验比我丰富得多。而我还得游啊游。)))

我认为权威 是一个主观的东西。这就好比一个国家的主权得到另一个国家的承认....。

引用:

权威包括主体(载体)对其杰出成就、知识、技能、能力及其在社会 中的特殊地位的认可......

所以,我承认你的:-)

tol64, 我们期待着您的新文章。

Авторитет — Википедия
  • ru.wikipedia.org
Авторитет (нем.  , от лат.   — «власть, влияние») — в общем смысле: значение и основанная на значении или с ним соединённая власть; в узком — влияние умственное, побуждающее уважение, доставляемое обладанием превосходной и признанной власти или выдающейся и признанной мудрости, знания, добродетели. Влияние индивида, основанное на занимаемом им...
 
在下一个代码块(例 4)中,我建议大家注意列表这种数据容器的一个主要缺点--访问元素的速度。问题在于,对列表元素的访问是线性的、 а в случае со списочным классом CList - бинарно, что немного уменьшает трудоёмкость алгоритма.
线性搜索的劳动强度为 O(N),二进制搜索的劳动强度为 log2(N)。


下面是访问数据集元素的示例代码:


你在哪里找到的二进制访问 CList 元素的复杂度为 log2(N)?

CList 是一个列表,而具有 log2(N) 复杂性的二进制访问需要瞬间跳转到具有 CurrentIndex +/- (CurrentIndex/2) 索引的节点,其中 CurrentIndex 是列表中的当前节点。

CList 的实现使用了标准的 QuickSearch(),在排序的情况下,它确实是通过引用 CurrentIndex +/- (CurrentIndex/2) 节点来搜索项目的。不过,这个节点本身是由 GetNodeAtIndex() 函数搜索的,其中并不存在奇迹。访问操作的全部复杂性都落在了它身上,特别是这些字符串上:

if(revers)
     {
      //--- 从右向左搜索
      for(;i>index;i--)
        {
         result=result.Prev();
         if(result==NULL)
            return(NULL);
        }
     }
   else
     {
      //--- 从左到右搜索
      for(;i<index;i++)
        {
         result=result.Next();
         if(result==NULL)
            return(NULL);
        }
     }

通过观察这些字符串,我们可以清楚地看到,搜索元素的复杂度极限为O(N/2),因为列表是双向的,所以从其中一端访问元素的次数不会超过 N/2 次。建议作者在撰写有关算法的文章之前,更深入地了解该算法。

根据我自己的经验,我可以说,由于处理数据几乎总是与搜索和排序有关,因此在实际任务中使用经典的 CList 效率几乎总是很低。列表首先在组合集合中表现出色,在组合集合中,通过索引访问与通过列表访问相结合。

出于某种原因,很少有人会想到指针转换比通过索引直接寻址要慢得多。通过 result.Next() 索引一千次要比通过索引一千次慢得多。

 
denkir:

昏迷

从图像开始。指针指向的是节点,而不是数据,数据只是节点的一部分,也就是说,在实现上存在冲突,可能会造成混淆。

公平地说,文本大部分是正常的。

关于实现。这些都是通过模板实现的。在 STL 中表示容器的最佳变体,虽然在这里使用迭代器和函数是失败的,不过你也许可以想出一些办法。

因此,你的空虚方法看起来不仅难以理解,而且非常糟糕。) 表的排序已经完成。某些方法的实现甚至声明都值得商榷,甚至令人费解。

零封装。

关于复杂性和二进制(!)搜索的启示在列表(!gg)完成。

结果,我们现在有了一个一切都难以理解和不方便的垃圾,甚至不能作为学习的范例(我认为)。

恕我直言)如果你想成为一名程序员,就应该学习正常编程。你能更好地实现它。

C-4:

从列表中可以立即看出,查找一个元素的复杂度是极限O(N/2),因为列表是双向的,所以从一端访问一个元素不会超过 N/2 次转换。作者在撰写相关文章之前,最好能更透彻地理解算法。

你最好也温习一下你的记忆,上面写的 O 首先是计算错误,其次是写法错误。

_____________________________________

最有趣的是,这还不是最差的资源文章。

 
TheXpert:

...

恕我直言 ) 你想成为一名程序员,就得正常地学习编程。你能更好地理解它。

你也应该好好温习一下你的记忆,上面写的 O 首先是计算错误,其次是书写错误。

...

我希望你也一样。看一看,你就会在被选中的人中脱颖而出))。