通用类库 - 错误、说明、问题、使用功能和建议 - 页 8 123456789101112131415...38 新评论 Реter Konow 2017.12.07 19:50 #71 以下是代码和输入字段 的内容。(它可能对某人有用。它可以被提炼)。//+------------------------------------------------------------------+ //| Dictionary.mq5 | //| Peter Konow | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Peter Konow" #property link "" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ #define Max_possible_collisions 100 #define Max_letters_in_word 100 #define All_letters_in_alphabet 255 //------------------------------------ string Dictionary[Max_possible_collisions][All_letters_in_alphabet][Max_letters_in_word]; //------------------------------------------------------------------- int OnInit() { //--- Create_text_box(); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectDelete(0,"Text_box"); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if(id == CHARTEVENT_OBJECT_ENDEDIT) { //----------------------- string Text; //--------------------- ObjectGetString(0,"Text_box",OBJPROP_TEXT,0,Text); //------------------------------------- Add(Text); } } //+------------------------------------------------------------------+ void Add(string word) { uchar First_letter = (uchar)StringGetCharacter(word,0) - 97; //----------------------- int All_letters_in_word = StringLen(word); //----------------------- for(int a1 = 0; a1 < Max_possible_collisions; a1++) { string word_inside = Dictionary[a1][First_letter][All_letters_in_word]; //----------------------- if(word_inside == NULL) { Dictionary[a1][First_letter][All_letters_in_word] = word; Print("Your word has been added to our dictionary!"); break; } if(word_inside == word) { Print("This word already exists in our dictionary"); break; } } //------------------------ } //--------------------------------------------------------------------+ //-------------------------------------------------------------------- void Create_text_box() { ObjectCreate(0,"Text_box",OBJ_EDIT,0,0,0); ObjectSetInteger(0,"Text_box",OBJPROP_XDISTANCE,500); ObjectSetInteger(0,"Text_box",OBJPROP_YDISTANCE,250); ObjectSetInteger(0,"Text_box",OBJPROP_XSIZE,400); ObjectSetInteger(0,"Text_box",OBJPROP_YSIZE,30); ObjectSetString(0,"Text_box",OBJPROP_TEXT,"Please enter your word here..."); ObjectSetString(0,"Text_box",OBJPROP_FONT,"TimesNewRoman"); ObjectSetInteger(0,"Text_box",OBJPROP_STATE,1); //---------------------------------------------- ObjectSetInteger(0,"Text_box",OBJPROP_FONTSIZE,12); ObjectSetInteger(0,"Text_box",OBJPROP_BGCOLOR,clrWhite); ObjectSetInteger(0,"Text_box",OBJPROP_COLOR,clrBlack); ObjectSetInteger(0,"Text_box",OBJPROP_BORDER_COLOR,clrBlack); ObjectSetInteger(0,"Text_box",OBJPROP_ALIGN,ALIGN_CENTER); //---------------------------------------------- ObjectSetInteger(0,"Text_box",OBJPROP_CORNER,CORNER_LEFT_UPPER); ObjectSetInteger(0,"Text_box",OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER); //---------------------------------------------- } //----------------------------------------------------------------------- 只是由于某些原因,它在四号机上完全工作。第五次,这个领域没有出现。我搜索了一下原因,没有找到。 Sergey Dzyublik 2017.12.07 20:23 #72 fxsaber: 也就是说,你必须在每个任务的字典大小(RAM)和哈希函数的计算复杂性(CPU)之间找到合适的平衡。相对来说是的。 当元素数量较少时,字典的最佳大小是元素数量的平方(就我在3年的课程中所记得的,但最好还是再确认一下)。 当大量的元素使得不可能选择最佳的尺寸时,他们采取了比预期元素数量大几倍的字典尺寸,并优化碰撞处理,例如,使用内部哈希表来处理每个碰撞。 试图挑选一个哈希表,使其尽可能快地被搜索到,但仍然提供所获得的结果在词表大小上的均匀分布。 素数在散列中的使用与分布的均匀性有关。 Alexey Viktorov 2017.12.08 08:09 #73 Konow tag: 我们不得不增加数组的大小,因为大写字母有不同的代码,会 "掉出 "数组。A "字的代码与 "a "字的代码正好相差32。相应地,其余的也都有32的差异。 也许数组的大小 不应该被增加,但第一个字符应该被替换。 Реter Konow 2017.12.08 08:50 #74 Alexey Viktorov: 字符 "A "的代码与字符 "a "的代码正好相差32。相应地,所有其他的也有32的差异。 也许数组的大小不应该被增加,第一个字符应该被替换。我同意。在这方面,该算法是不完整的。阵列大小 太大。我昨天并没有完全理解字母代码。 Alexey Viktorov 2017.12.08 08:53 #75 标签 Konow:以下是代码和输入字段 的内容。(它可能对某人有用。你可以提炼它)。但它在4号机上运行得非常好。这个字段没有出现在5个。我搜索了一下原因,没有找到。还有一句话:在Vasiliy的例子中,提到了一个数组 关于交易、自动交易系统和策略测试的论坛 通用类库 - 错误、描述、问题、使用的特殊性、建议 Vasiliy Sokolov, 2017.12.07 14:30 在关联数组中非常简单 #1Generic中提出的许多算法都是基于关联数组或字典的。这也是最常用的两种算法之一。如果我说90%的编程任务都是用数组和字典来完成的,我想我已经接近事实了。在进入实践之前,让我们以最清晰、最直接的方式来描述词典的工作,故意简化一些细节。我们将在一个非常简单的例子上展示这个词典:一个普通的单词表。假设我们只有几个词,都以不同的字母开头。string words[] = {"apple", "cat", "fog", "dog", "walk", "zero"};英语字母表包含26个字符。让我们创建一个字符串数组,大小为26个元素。string dictionary[26];现在,如果我们同意将单词存储在与它们的第一个字母相对应的索引中,我们将得到一个简单的字典。我们将从头开始索引。苹果 "这个词将被存储在我们的字典中的索引0,因为字符 "a "是字母表的第一个字母,"猫"--在索引1,"狗"--在索引3,雾--将占据索引4,步行--索引24,零--最后的索引25。请注意,索引5至23将不被使用。这是一种额外的内存浪费,但我们可以立即访问例如单词 "walk",因为我们知道,如果它存在,它位于索引24处。让我们写出我们的第一个空字典。而在你的例子中。 #define Max_possible_collisions 100 #define Max_letters_in_word 100 #define All_letters_in_alphabet 255 //------------------------------------ string Dictionary[Max_possible_collisions][All_letters_in_alphabet][Max_letters_in_word];一个3维数组需要多少内存?如果你要增加维度呢? Реter Konow 2017.12.08 08:58 #76 Alexey Viktorov: 还有一个问题:在Vasiliy的例子中,提到了一个数组而在你的例子中。 一个3维数组需要多少内存?如果我们要增加维度呢?阵列的大小 太大,因为。1.我已经决定,一个单词的最大字母数可以是100。这显然是太多了。我们可以把它减少到30。 2.可能的字母数量也被证明是过多的。我决定为尽可能多的不同角色留出空间。可以减少。3.碰撞 "的数量,即通过第一个字母和单词中的字母数量来匹配单词,被设定为100。这也太过分了。你可以下降到50。我看不出有什么理由要增加它。你可以只添加一本字典。 Alexey Viktorov 2017.12.08 09:08 #77 标签 Konow:阵列的大小太大,因为。1.我决定,一个单词中的字母数最多可以是100。这显然是矫枉过正。可以减少到30人。 2.可能的字母数量也被证明是过多的。我决定为尽可能多的不同角色留出空间。可以减少。3.碰撞 "的数量,即通过第一个字母和单词中的字母数量来匹配单词,被设定为100。这也太过分了。你可以把它减少到50。我不认为有任何理由要增加尺寸。你可能只是做了另一本字典。这个问题不是关于字典的。字典只是一个关于如何建立算法的例子。可能远不是像你的例子中的100个项目,而是1e10和更多...在这种情况下,阵列的大小是多少?例如,在一个数组中收集所有可用的打勾历史。在一毫秒内可能有不止一个刻度,所以数组不能是一维的......。在一毫秒内最多有多少次跳动?两个还是五个?在这种情况下,阵列的维度 应该是 多少?会浪费多少内存? fxsaber 2017.12.08 09:36 #78 Alexey Viktorov: 例如,在一个数组中收集所有可用的打勾历史。在写完这些之后,我突然想到,以线程中讨论的方式来存储ticks是没有实际任务的。它们按时间排序并存储在一个简单的数组中。这与历史订单/上诉是一样的。而且,从HistorySelect 来看,它们是按时间存储在一个数组中。而且我认为,(在目前的实施中)没有任何东西可以让人通过票据或ID来搜索记录。而这一切都是因为在被命名的历史案例中,做出这样的事情是不合理的。一个用于练习的简单阵列就很足够了。这就是为什么我对交易领域的任务的实际措辞感兴趣。当你试图加快HistorySelect的速度时,我相信你是通过缓存来解决问题的,而不是通过带有哈希值的字典来解决。 Alexey Viktorov 2017.12.08 10:44 #79 fxsaber:在写完这些之后,我突然想到,以线程中讨论的方式来存储ticks是没有实际任务的。它们按时间排序并存储在一个简单的数组中。这与历史订单/上诉是一样的。而且,从HistorySelect来看,它们是按时间存储在一个数组中。而且我认为,(在目前的实施中)没有任何东西可以让人通过票据或ID来搜索记录。而这一切都是因为在被命名的历史案例中,做出这样的事情是不合理的。一个用于练习的简单阵列就很足够了。这就是为什么我对交易领域的任务的实际措辞感兴趣。当你加快HistorySelect的速度时,你可能是用缓存来解决的,而不是用哈希字典。没有争论,但如果有人想这样实施一些任务,那么就当场打出旗号......有人认为没有意义,有人不能掌握它......。而在这两种情况下,都有更简单的实现方式。但谁知道 "明天 "交易会如何发展呢?有了它而无人认领,可能比没有它而需要它更好。 Реter Konow 2017.12.08 11:15 #80 阿列克谢-维克多罗夫。这个问题不是关于字典的。词典只是算法构建的一个例子。而且,可能远远不是像你的例子中的100个项目,而是1e10或更多...在这种情况下,阵列的大小是多少?例如,将所有可用的蜱虫历史收集到一个数组中。在一毫秒内可能有不止一个刻度,所以数组不能是一维的...但在一毫秒内最多有多少次抽动?两个还是五个?在这种情况下,阵列的维度 应该是 多少?会浪费多少内存?我正在解决构建一个方便的字典的任务。 蜱虫或其他元素都有自己的特定属性,可以成功建立索引,以便快速访问存储位置。 快速访问数据的任务的本质,是确定一个元素的几个可分类的属性,并对其进行索引。 取一个元素,找到方便的属性,你可以从中获得索引,通过索引获得对存储位置的访问。 如果索引不够(例如,我们可以索引第一个字母和字母数,但其他属性没有提供方便的索引),我们就直接对其周围区域内的元素进行粗暴攻击。 该原则是普遍的,实施起来可能有所不同。 123456789101112131415...38 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
以下是代码和输入字段 的内容。(它可能对某人有用。它可以被提炼)。
只是由于某些原因,它在四号机上完全工作。第五次,这个领域没有出现。我搜索了一下原因,没有找到。
也就是说,你必须在每个任务的字典大小(RAM)和哈希函数的计算复杂性(CPU)之间找到合适的平衡。
相对来说是的。
当元素数量较少时,字典的最佳大小是元素数量的平方(就我在3年的课程中所记得的,但最好还是再确认一下)。
当大量的元素使得不可能选择最佳的尺寸时,他们采取了比预期元素数量大几倍的字典尺寸,并优化碰撞处理,例如,使用内部哈希表来处理每个碰撞。
试图挑选一个哈希表,使其尽可能快地被搜索到,但仍然提供所获得的结果在词表大小上的均匀分布。
素数在散列中的使用与分布的均匀性有关。
我们不得不增加数组的大小,因为大写字母有不同的代码,会 "掉出 "数组。
A "字的代码与 "a "字的代码正好相差32。相应地,其余的也都有32的差异。
也许数组的大小 不应该被增加,但第一个字符应该被替换。字符 "A "的代码与字符 "a "的代码正好相差32。相应地,所有其他的也有32的差异。
也许数组的大小不应该被增加,第一个字符应该被替换。我同意。在这方面,该算法是不完整的。
阵列大小 太大。我昨天并没有完全理解字母代码。
以下是代码和输入字段 的内容。(它可能对某人有用。你可以提炼它)。
但它在4号机上运行得非常好。这个字段没有出现在5个。我搜索了一下原因,没有找到。
还有一句话:在Vasiliy的例子中,提到了一个数组
关于交易、自动交易系统和策略测试的论坛
通用类库 - 错误、描述、问题、使用的特殊性、建议
Vasiliy Sokolov, 2017.12.07 14:30
在关联数组中非常简单 #1
Generic中提出的许多算法都是基于关联数组或字典的。这也是最常用的两种算法之一。如果我说90%的编程任务都是用数组和字典来完成的,我想我已经接近事实了。在进入实践之前,让我们以最清晰、最直接的方式来描述词典的工作,故意简化一些细节。
我们将在一个非常简单的例子上展示这个词典:一个普通的单词表。假设我们只有几个词,都以不同的字母开头。
英语字母表包含26个字符。让我们创建一个字符串数组,大小为26个元素。
现在,如果我们同意将单词存储在与它们的第一个字母相对应的索引中,我们将得到一个简单的字典。我们将从头开始索引。苹果 "这个词将被存储在我们的字典中的索引0,因为字符 "a "是字母表的第一个字母,"猫"--在索引1,"狗"--在索引3,雾--将占据索引4,步行--索引24,零--最后的索引25。
请注意,索引5至23将不被使用。这是一种额外的内存浪费,但我们可以立即访问例如单词 "walk",因为我们知道,如果它存在,它位于索引24处。
让我们写出我们的第一个空字典。
而在你的例子中。
一个3维数组需要多少内存?如果你要增加维度呢?
还有一个问题:在Vasiliy的例子中,提到了一个数组
而在你的例子中。
一个3维数组需要多少内存?如果我们要增加维度呢?
阵列的大小 太大,因为。
1.我已经决定,一个单词的最大字母数可以是100。这显然是太多了。我们可以把它减少到30。
2.可能的字母数量也被证明是过多的。我决定为尽可能多的不同角色留出空间。可以减少。
3.碰撞 "的数量,即通过第一个字母和单词中的字母数量来匹配单词,被设定为100。这也太过分了。你可以下降到50。
我看不出有什么理由要增加它。你可以只添加一本字典。
阵列的大小太大,因为。
1.我决定,一个单词中的字母数最多可以是100。这显然是矫枉过正。可以减少到30人。
2.可能的字母数量也被证明是过多的。我决定为尽可能多的不同角色留出空间。可以减少。
3.碰撞 "的数量,即通过第一个字母和单词中的字母数量来匹配单词,被设定为100。这也太过分了。你可以把它减少到50。
我不认为有任何理由要增加尺寸。你可能只是做了另一本字典。
这个问题不是关于字典的。字典只是一个关于如何建立算法的例子。可能远不是像你的例子中的100个项目,而是1e10和更多...在这种情况下,阵列的大小是多少?
例如,在一个数组中收集所有可用的打勾历史。在一毫秒内可能有不止一个刻度,所以数组不能是一维的......。在一毫秒内最多有多少次跳动?两个还是五个?在这种情况下,阵列的维度 应该是 多少?会浪费多少内存?
例如,在一个数组中收集所有可用的打勾历史。
在写完这些之后,我突然想到,以线程中讨论的方式来存储ticks是没有实际任务的。它们按时间排序并存储在一个简单的数组中。
这与历史订单/上诉是一样的。而且,从HistorySelect 来看,它们是按时间存储在一个数组中。而且我认为,(在目前的实施中)没有任何东西可以让人通过票据或ID来搜索记录。
而这一切都是因为在被命名的历史案例中,做出这样的事情是不合理的。一个用于练习的简单阵列就很足够了。
这就是为什么我对交易领域的任务的实际措辞感兴趣。
当你试图加快HistorySelect的速度时,我相信你是通过缓存来解决问题的,而不是通过带有哈希值的字典来解决。
在写完这些之后,我突然想到,以线程中讨论的方式来存储ticks是没有实际任务的。它们按时间排序并存储在一个简单的数组中。
这与历史订单/上诉是一样的。而且,从HistorySelect来看,它们是按时间存储在一个数组中。而且我认为,(在目前的实施中)没有任何东西可以让人通过票据或ID来搜索记录。
而这一切都是因为在被命名的历史案例中,做出这样的事情是不合理的。一个用于练习的简单阵列就很足够了。
这就是为什么我对交易领域的任务的实际措辞感兴趣。
当你加快HistorySelect的速度时,你可能是用缓存来解决的,而不是用哈希字典。
没有争论,但如果有人想这样实施一些任务,那么就当场打出旗号......
有人认为没有意义,有人不能掌握它......。而在这两种情况下,都有更简单的实现方式。但谁知道 "明天 "交易会如何发展呢?有了它而无人认领,可能比没有它而需要它更好。
这个问题不是关于字典的。词典只是算法构建的一个例子。而且,可能远远不是像你的例子中的100个项目,而是1e10或更多...在这种情况下,阵列的大小是多少?
例如,将所有可用的蜱虫历史收集到一个数组中。在一毫秒内可能有不止一个刻度,所以数组不能是一维的...但在一毫秒内最多有多少次抽动?两个还是五个?在这种情况下,阵列的维度 应该是 多少?会浪费多少内存?
我正在解决构建一个方便的字典的任务。
蜱虫或其他元素都有自己的特定属性,可以成功建立索引,以便快速访问存储位置。
快速访问数据的任务的本质,是确定一个元素的几个可分类的属性,并对其进行索引。
取一个元素,找到方便的属性,你可以从中获得索引,通过索引获得对存储位置的访问。
如果索引不够(例如,我们可以索引第一个字母和字母数,但其他属性没有提供方便的索引),我们就直接对其周围区域内的元素进行粗暴攻击。
该原则是普遍的,实施起来可能有所不同。