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

 
瓦西里-索科洛夫

碰巧的是,不同的单词都是以同一个字母开头的。如果我们把 "apple "放在我们以前的字典里,然后试图把 "application "放进去,就不会成功了。索引0将被苹果这个词占据。在这种情况下,我们说的是哈希函数的碰撞。我们的哈希函数非常简单--它返回单词的第一个字符的数字,所以这个函数的碰撞会非常频繁。为了存储不同的单词,以相同的字母开头,我们将做加法:我们将不在数组中存储元素,而是在数组的数组中存储。在这种情况下,索引0将包含另一个有两个词的数组:"苹果 "和 "应用"。

现在,我们的字典里储存了甚至以相同字母开头的单词。但访问具有相同首字母的单词的成本会增加。因为现在我们需要对所有以'a'开头的词进行全面搜索,以找出'application'这个词是否在字典中。 如果我们的哈希函数产生不同的数字,即使这些词只相差一个字符,那么尝试具有相同索引的词的概率将趋于零,对一个任意元素的访问将趋于o(1).这正是在真正的字典中发生的情况,在那里使用的函数是防碰撞的,所以我们可以肯定地说,对这些集合中的元素的访问是非常快的,几乎没有搜索。

我将尝试提供我对这个例子的解决方案。没有指针。稍后。
 

我最近读了一本关于这个问题的书。它被称为"嘎吱嘎吱的 算法"。每件事都有非常清晰的布局,并有实例。

 
瓦西里-索科洛夫

在下一个例子中,我们将改进它,使其能够存储以相同字母开头的单词。

请简明扼要地写,不要有任何标题或不必要的实体。

例如,这个

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中,它可能是垃圾。

 
fxsaber:

请简明扼要地写,不要有混乱的帽子和多余的实体。

...


坚决反对!代码最好是全写。看看所有的MQ代码--到处都有 "帽子"。这就是标准。


fxsaber:

...

然而,MT4/5的这段代码可能会有不同的效果,因为在MT4中,数组被初始化为NULL值,而在MT5中,它可能是垃圾。


这与旧终端有什么关系?如果你懒惰,仍然使用旧的,这是你自己的问题。社区不应该因为这种懒惰的人而放慢脚步。

 
弗拉基米尔-卡尔普托夫

看看所有的MQ代码--到处都是 "帽子"。这就是标准。

去他妈的标准,本质在这里很重要,而不是占50%代码的风格。

 
fxsaber:

去他妈的标准,重要的是本质,而不是占了50%代码的风格。


论坛的主要任务是教育。因此,代码应该扩大和明确,尽可能接近标准。

 
瓦西里-索科洛夫

这正是在真正的字典中发生的情况;那里使用的函数是抗碰撞的,所以我们可以肯定地说,对这些集合中的项目的访问是非常快的,几乎没有超调。

也就是说,对于每个任务来说,有必要在字典大小(RAM)和哈希函数的计算复杂性(CPU)之间找到中间地带。

 
弗拉基米尔-卡尔普托夫

论坛的主要目的是为了教育。因此,应该扩展和理解该代码

这就够了。

尽可能地接近标准。

你可以插入你自己的页眉。A100在SD中发布了数百份没有上限的报告--这就是标准!因为本质才是最重要的,而不是锦上添花。

 
有一个解决方案。然而,为了暂时保留好奇心,我想在这里发布可执行文件。此外,有能力的人将比较我的解决方案和上述作者提供的解决方案的性能。我想知道哪种工作更快。
附加的文件:
Dictionary.ex5  10 kb
 
ReTeg Konow:
有一个解决方案。然而,为了暂时保持好奇心,我想在这里发布节选。此外,有能力的人将比较我的解决方案和上述作者提供的解决方案的性能。我想知道哪种工作更快。
你需要运行该可执行文件。将出现一个输入字段。接下来,你可以键入不同的单词。如果有匹配的词,打印机就会通知你,这个词在字典里。如果不存在这个词,你会被通知这个词已经被添加到词典中。