Algorithm 哈希表与子串匹配
我有数百把钥匙,例如:Algorithm 哈希表与子串匹配,algorithm,hashtable,Algorithm,Hashtable,我有数百把钥匙,例如: 红苹果 曼尼雷德 福尔曼 蓝苹果 我有与这些键相关的数据,数据是一个字符串,在末尾有相关键 红苹果:这棵树有红苹果 曼尼雷德:她看到了曼尼雷德 福勒曼:他们买了福勒曼的礼物 蓝苹果:这是令人惊讶的,但它是一个蓝苹果 我希望使用哈希表和哈希函数根据键记录数据,并且我希望能够从表中重设数据 我知道使用哈希函数和哈希表,这里没有问题 但是 我希望给程序一个字符串,该字符串作为子字符串出现,并检索匹配键的数据 例如: 我必须给“红色”,并且必须能够得到 红苹果:这棵树有
- 红苹果
- 曼尼雷德
- 福尔曼
- 蓝苹果
- 红苹果:这棵树有红苹果
- 曼尼雷德:她看到了曼尼雷德
- 福勒曼:他们买了福勒曼的礼物
- 蓝苹果:这是令人惊讶的,但它是一个蓝苹果
- 红苹果:这棵树有红苹果
- 曼尼雷德:她看到了曼尼雷德
- 红苹果:这棵树有红苹果
- 蓝苹果:这是令人惊讶的,但它是一个蓝苹果
谢谢你的建议,想法。可能你应该使用n-gram的反转索引,同样的方法也用于拼写更正。对于wordredapple您将拥有以下3个语法集red、eda、dap、app、ppl、ple。对于每个n-gram,您将有一个包含它的字符串列表。例如,对于红色,它将是 red->maninred,redapple 此列表中的单词必须按顺序排列。当您想要查找包含给定子字符串的所有字符串时,您将该子字符串分割为n-gram,并截取n-gram的单词列表
这个alogriphm不是O(n),但它有足够的速度 在哈希表中无法很好地完成。给定一个子字符串-您无法预测整个字符串1的哈希结果 一个合理的选择是使用一个。后缀树中的每个终端将保存完整字符串的引用列表,该后缀与 给定一个子串
t
,如果它确实是集合中某个s
的子串,则有一个s
的后缀x
——这样t
就是x
的前缀。通过在读取t
的同时遍历后缀树,找到从节点到达的所有终端。这些终端包含所有需要的字符串
(1) 假设哈希函数合理,如果每个元素的hashCode()==0,显然可以预测哈希值。我最近研究过这个问题,我确信这是不可能的。我希望哈希表能像你一样帮助我提高搜索速度,但它让我失望。为什么“希望你使用哈希表”?后缀树将更适合。此外,我相信您不能在
O(1)
中执行此操作,因为对于字符串“”
(空字符串),您必须输出整个集合。此外,在讨论字符串时,通常将字符串读为“代码> o(s s))/>代码,而不是<代码> o(1)< /代码> @如果要在字符串的中间设置后缀“树”,则感谢响应,而不是考虑字符串内的操作时间的第一个问题。是的,这是一个家庭作业,但我不想要答案。我想知道这个问题问得对不对。我只是想知道我应该搜索所有字符串以获得给定的子字符串(查询参数/搜索输入),还是像oracle一样预测哈希代码是否告诉我它们的键字符串具有substring@AdamMatan:当然会-如果有一个字符串s
,t
是s
的子字符串,然后t
将是s
的某个后缀的前缀。你可以通过遍历树很容易地发现它。非常感谢你的详细回答,我理解你在我的问题中详细说明了第一个选择,我必须迭代给定输入的所有单词列表。对于搜索输入,我必须查看每个单词的n-gram。我理解对了吗?请注意,所有n-gram的列表是O(n^2)
空格,它将使每个insert()
和remove()
运算速度至少慢一倍O(logn)
,因为应该首先找到索引中的相关位置。嘿,有人来回答我吗,没有机会不在包含输入子字符串的关键字列表中查找单词,对吗?我只是想知道,是否有一种神奇的方法,可以仅通过查看输入搜索子字符串来预测键的哈希代码?或者是否有一种方法可以编写一个神奇的哈希函数,当我将输入搜索子字符串赋予它时,它告诉我键的位置,其中包含子字符串?tuxi第一个问题是的,首先你应该建立单词索引。当你搜索最小的集合时,你可以只对它进行迭代,或者对列表交叉点使用相同的特殊算法。这是可以做到的,这是公认的答案。您可以对所有子字符串或可能只是感兴趣的n-gram进行索引。然后,您可以查找该索引。但这只有在你坚持usi的情况下才行