通用类库 - 错误、说明、问题、使用功能和建议 - 页 8

 

以下是代码和输入字段 的内容。(它可能对某人有用。它可以被提炼)。

//+------------------------------------------------------------------+
//|                                                   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);  
  //---------------------------------------------- 
}
//----------------------------------------------------------------------- 

只是由于某些原因,它在四号机上完全工作。第五次,这个领域没有出现。我搜索了一下原因,没有找到。

 
fxsaber:

也就是说,你必须在每个任务的字典大小(RAM)和哈希函数的计算复杂性(CPU)之间找到合适的平衡。


相对来说是的。
当元素数量较少时,字典的最佳大小是元素数量的平方(就我在3年的课程中所记得的,但最好还是再确认一下)。
当大量的元素使得不可能选择最佳的尺寸时,他们采取了比预期元素数量大几倍的字典尺寸,并优化碰撞处理,例如,使用内部哈希表来处理每个碰撞。

试图挑选一个哈希表,使其尽可能快地被搜索到,但仍然提供所获得的结果在词表大小上的均匀分布
素数在散列中的使用与分布的均匀性有关。

 
Konow tag:
我们不得不增加数组的大小,因为大写字母有不同的代码,会 "掉出 "数组。

A "字的代码与 "a "字的代码正好相差32。相应地,其余的也都有32的差异。

也许数组的大小 不应该被增加,但第一个字符应该被替换。
 
Alexey Viktorov:

字符 "A "的代码与字符 "a "的代码正好相差32。相应地,所有其他的也有32的差异。

也许数组的大小不应该被增加,第一个字符应该被替换。

我同意。在这方面,该算法是不完整的。

阵列大小 太大。我昨天并没有完全理解字母代码。

 
标签 Konow:

以下是代码和输入字段 的内容。(它可能对某人有用。你可以提炼它)。

但它在4号机上运行得非常好。这个字段没有出现在5个。我搜索了一下原因,没有找到。

还有一句话:在Vasiliy的例子中,提到了一个数组

关于交易、自动交易系统和策略测试的论坛

通用类库 - 错误、描述、问题、使用的特殊性、建议

Vasiliy Sokolov, 2017.12.07 14:30

在关联数组中非常简单 #1

Generic中提出的许多算法都是基于关联数组或字典的。这也是最常用的两种算法之一。如果我说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维数组需要多少内存?如果你要增加维度呢?

 
Alexey Viktorov:

还有一个问题:在Vasiliy的例子中,提到了一个数组


而在你的例子中。

一个3维数组需要多少内存?如果我们要增加维度呢?

阵列的大小 太大,因为。

1.我已经决定,一个单词的最大字母数可以是100。这显然是太多了。我们可以把它减少到30。

2.可能的字母数量也被证明是过多的。我决定为尽可能多的不同角色留出空间。可以减少。

3.碰撞 "的数量,即通过第一个字母和单词中的字母数量来匹配单词,被设定为100。这也太过分了。你可以下降到50。


我看不出有什么理由要增加它。你可以只添加一本字典。

 
标签 Konow:

阵列的大小太大,因为。

1.我决定,一个单词中的字母数最多可以是100。这显然是矫枉过正。可以减少到30人。

2.可能的字母数量也被证明是过多的。我决定为尽可能多的不同角色留出空间。可以减少。

3.碰撞 "的数量,即通过第一个字母和单词中的字母数量来匹配单词,被设定为100。这也太过分了。你可以把它减少到50。


我不认为有任何理由要增加尺寸。你可能只是做了另一本字典。

这个问题不是关于字典的。字典只是一个关于如何建立算法的例子。可能远不是像你的例子中的100个项目,而是1e10和更多...在这种情况下,阵列的大小是多少?

例如,在一个数组中收集所有可用的打勾历史。在一毫秒内可能有不止一个刻度,所以数组不能是一维的......。在一毫秒内最多有多少次跳动?两个还是五个?在这种情况下,阵列的维度 应该 多少?会浪费多少内存?

 
Alexey Viktorov:

例如,在一个数组中收集所有可用的打勾历史。

在写完这些之后,我突然想到,以线程中讨论的方式来存储ticks是没有实际任务的。它们按时间排序并存储在一个简单的数组中。

这与历史订单/上诉是一样的。而且,从HistorySelect 来看,它们是按时间存储在一个数组中。而且我认为,(在目前的实施中)没有任何东西可以让人通过票据或ID来搜索记录。

而这一切都是因为在被命名的历史案例中,做出这样的事情是不合理的。一个用于练习的简单阵列就很足够了。

这就是为什么我对交易领域的任务的实际措辞感兴趣。


当你试图加快HistorySelect的速度时,我相信你是通过缓存来解决问题的,而不是通过带有哈希值的字典来解决。

 
fxsaber:

在写完这些之后,我突然想到,以线程中讨论的方式来存储ticks是没有实际任务的。它们按时间排序并存储在一个简单的数组中。

这与历史订单/上诉是一样的。而且,从HistorySelect来看,它们是按时间存储在一个数组中。而且我认为,(在目前的实施中)没有任何东西可以让人通过票据或ID来搜索记录。

而这一切都是因为在被命名的历史案例中,做出这样的事情是不合理的。一个用于练习的简单阵列就很足够了。

这就是为什么我对交易领域的任务的实际措辞感兴趣


当你加快HistorySelect的速度时,你可能是用缓存来解决的,而不是用哈希字典。

没有争论,但如果有人想这样实施一些任务,那么就当场打出旗号......

有人认为没有意义,有人不能掌握它......。而在这两种情况下,都有更简单的实现方式。但谁知道 "明天 "交易会如何发展呢?有了它而无人认领,可能比没有它而需要它更好。

 
阿列克谢-维克多罗夫

这个问题不是关于字典的。词典只是算法构建的一个例子。而且,可能远远不是像你的例子中的100个项目,而是1e10或更多...在这种情况下,阵列的大小是多少?

例如,将所有可用的蜱虫历史收集到一个数组中。在一毫秒内可能有不止一个刻度,所以数组不能是一维的...但在一毫秒内最多有多少次抽动?两个还是五个?在这种情况下,阵列的维度 应该 多少?会浪费多少内存?

我正在解决构建一个方便的字典的任务。

蜱虫或其他元素都有自己的特定属性,可以成功建立索引,以便快速访问存储位置。

快速访问数据的任务的本质,是确定一个元素的几个可分类的属性,并对其进行索引。

取一个元素,找到方便的属性,你可以从中获得索引,通过索引获得对存储位置的访问。

如果索引不够(例如,我们可以索引第一个字母和字母数,但其他属性没有提供方便的索引),我们就直接对其周围区域内的元素进行粗暴攻击。

该原则是普遍的,实施起来可能有所不同。