通用类库 - 错误、说明、问题、使用功能和建议 - 页 6 12345678910111213...38 新评论 Реter Konow 2017.12.07 15:14 #51 瓦西里-索科洛夫。碰巧的是,不同的单词都是以同一个字母开头的。如果我们把 "apple "放在我们以前的字典里,然后试图把 "application "放进去,就不会成功了。索引0将被苹果这个词占据。在这种情况下,我们说的是哈希函数的碰撞。我们的哈希函数非常简单--它返回单词的第一个字符的数字,所以这个函数的碰撞会非常频繁。为了存储不同的单词,以相同的字母开头,我们将做加法:我们将不在数组中存储元素,而是在数组的数组中存储。在这种情况下,索引0将包含另一个有两个词的数组:"苹果 "和 "应用"。现在,我们的字典里储存了甚至以相同字母开头的单词。但访问具有相同首字母的单词的成本会增加。因为现在我们需要对所有以'a'开头的词进行全面搜索,以找出'application'这个词是否在字典中。 如果我们的哈希函数产生不同的数字,即使这些词只相差一个字符,那么尝试具有相同索引的词的概率将趋于零,对一个任意元素的访问将趋于o(1).这正是在真正的字典中发生的情况,在那里使用的函数是防碰撞的,所以我们可以肯定地说,对这些集合中的元素的访问是非常快的,几乎没有搜索。 我将尝试提供我对这个例子的解决方案。没有指针。稍后。 [删除] 2017.12.07 16:43 #52 我最近读了一本关于这个问题的书。它被称为"嘎吱嘎吱的 算法"。每件事都有非常清晰的布局,并有实例。 fxsaber 2017.12.07 18:29 #53 瓦西里-索科洛夫。在下一个例子中,我们将改进它,使其能够存储以相同字母开头的单词。请简明扼要地写,不要有任何标题或不必要的实体。例如,这个bool Contains(string word) { uchar index = (uchar)StringGetCharacter(word, 0)-97; return words[index] != NULL; }可以用更清晰的方式来写。bool Contains(string word) { return words[word[0]-'a'] != NULL; }而且这段代码在MT4/5中的工作方式可能不同,因为在MT4中,数组的初始化值为NULL,而在MT5中,它可能是垃圾。 Vladimir Karputov 2017.12.07 18:31 #54 fxsaber:请简明扼要地写,不要有混乱的帽子和多余的实体。...坚决反对!代码最好是全写。看看所有的MQ代码--到处都有 "帽子"。这就是标准。 fxsaber:...然而,MT4/5的这段代码可能会有不同的效果,因为在MT4中,数组被初始化为NULL值,而在MT5中,它可能是垃圾。这与旧终端有什么关系?如果你懒惰,仍然使用旧的,这是你自己的问题。社区不应该因为这种懒惰的人而放慢脚步。 fxsaber 2017.12.07 18:35 #55 弗拉基米尔-卡尔普托夫。看看所有的MQ代码--到处都是 "帽子"。这就是标准。去他妈的标准,本质在这里很重要,而不是占50%代码的风格。 Vladimir Karputov 2017.12.07 18:36 #56 fxsaber:去他妈的标准,重要的是本质,而不是占了50%代码的风格。论坛的主要任务是教育。因此,代码应该扩大和明确,尽可能接近标准。 fxsaber 2017.12.07 18:36 #57 瓦西里-索科洛夫。这正是在真正的字典中发生的情况;那里使用的函数是抗碰撞的,所以我们可以肯定地说,对这些集合中的项目的访问是非常快的,几乎没有超调。也就是说,对于每个任务来说,有必要在字典大小(RAM)和哈希函数的计算复杂性(CPU)之间找到中间地带。 fxsaber 2017.12.07 18:41 #58 弗拉基米尔-卡尔普托夫。 论坛的主要目的是为了教育。因此,应该扩展和理解该代码这就够了。尽可能地接近标准。你可以插入你自己的页眉。A100在SD中发布了数百份没有上限的报告--这就是标准!因为本质才是最重要的,而不是锦上添花。 Реter Konow 2017.12.07 18:44 #59 有一个解决方案。然而,为了暂时保留好奇心,我想在这里发布可执行文件。此外,有能力的人将比较我的解决方案和上述作者提供的解决方案的性能。我想知道哪种工作更快。 附加的文件: Dictionary.ex5 10 kb Реter Konow 2017.12.07 18:48 #60 ReTeg Konow: 有一个解决方案。然而,为了暂时保持好奇心,我想在这里发布节选。此外,有能力的人将比较我的解决方案和上述作者提供的解决方案的性能。我想知道哪种工作更快。 你需要运行该可执行文件。将出现一个输入字段。接下来,你可以键入不同的单词。如果有匹配的词,打印机就会通知你,这个词在字典里。如果不存在这个词,你会被通知这个词已经被添加到词典中。 12345678910111213...38 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
碰巧的是,不同的单词都是以同一个字母开头的。如果我们把 "apple "放在我们以前的字典里,然后试图把 "application "放进去,就不会成功了。索引0将被苹果这个词占据。在这种情况下,我们说的是哈希函数的碰撞。我们的哈希函数非常简单--它返回单词的第一个字符的数字,所以这个函数的碰撞会非常频繁。为了存储不同的单词,以相同的字母开头,我们将做加法:我们将不在数组中存储元素,而是在数组的数组中存储。在这种情况下,索引0将包含另一个有两个词的数组:"苹果 "和 "应用"。
现在,我们的字典里储存了甚至以相同字母开头的单词。但访问具有相同首字母的单词的成本会增加。因为现在我们需要对所有以'a'开头的词进行全面搜索,以找出'application'这个词是否在字典中。 如果我们的哈希函数产生不同的数字,即使这些词只相差一个字符,那么尝试具有相同索引的词的概率将趋于零,对一个任意元素的访问将趋于o(1).这正是在真正的字典中发生的情况,在那里使用的函数是防碰撞的,所以我们可以肯定地说,对这些集合中的元素的访问是非常快的,几乎没有搜索。
我最近读了一本关于这个问题的书。它被称为"嘎吱嘎吱的 算法"。每件事都有非常清晰的布局,并有实例。
在下一个例子中,我们将改进它,使其能够存储以相同字母开头的单词。
请简明扼要地写,不要有任何标题或不必要的实体。
例如,这个
可以用更清晰的方式来写。
而且这段代码在MT4/5中的工作方式可能不同,因为在MT4中,数组的初始化值为NULL,而在MT5中,它可能是垃圾。
请简明扼要地写,不要有混乱的帽子和多余的实体。
...
坚决反对!代码最好是全写。看看所有的MQ代码--到处都有 "帽子"。这就是标准。
...
然而,MT4/5的这段代码可能会有不同的效果,因为在MT4中,数组被初始化为NULL值,而在MT5中,它可能是垃圾。
这与旧终端有什么关系?如果你懒惰,仍然使用旧的,这是你自己的问题。社区不应该因为这种懒惰的人而放慢脚步。
看看所有的MQ代码--到处都是 "帽子"。这就是标准。
去他妈的标准,本质在这里很重要,而不是占50%代码的风格。
去他妈的标准,重要的是本质,而不是占了50%代码的风格。
论坛的主要任务是教育。因此,代码应该扩大和明确,尽可能接近标准。
这正是在真正的字典中发生的情况;那里使用的函数是抗碰撞的,所以我们可以肯定地说,对这些集合中的项目的访问是非常快的,几乎没有超调。
也就是说,对于每个任务来说,有必要在字典大小(RAM)和哈希函数的计算复杂性(CPU)之间找到中间地带。
论坛的主要目的是为了教育。因此,应该扩展和理解该代码
这就够了。
尽可能地接近标准。
你可以插入你自己的页眉。A100在SD中发布了数百份没有上限的报告--这就是标准!因为本质才是最重要的,而不是锦上添花。
有一个解决方案。然而,为了暂时保持好奇心,我想在这里发布节选。此外,有能力的人将比较我的解决方案和上述作者提供的解决方案的性能。我想知道哪种工作更快。