Algorithm 哈希表与子串匹配

Algorithm 哈希表与子串匹配,algorithm,hashtable,Algorithm,Hashtable,我有数百把钥匙,例如: 红苹果 曼尼雷德 福尔曼 蓝苹果 我有与这些键相关的数据,数据是一个字符串,在末尾有相关键 红苹果:这棵树有红苹果 曼尼雷德:她看到了曼尼雷德 福勒曼:他们买了福勒曼的礼物 蓝苹果:这是令人惊讶的,但它是一个蓝苹果 我希望使用哈希表和哈希函数根据键记录数据,并且我希望能够从表中重设数据 我知道使用哈希函数和哈希表,这里没有问题 但是 我希望给程序一个字符串,该字符串作为子字符串出现,并检索匹配键的数据 例如: 我必须给“红色”,并且必须能够得到 红苹果:这棵树有

我有数百把钥匙,例如:

  • 红苹果
  • 曼尼雷德
  • 福尔曼
  • 蓝苹果
我有与这些键相关的数据,数据是一个字符串,在末尾有相关键

  • 红苹果:这棵树有红苹果
  • 曼尼雷德:她看到了曼尼雷德
  • 福勒曼:他们买了福勒曼的礼物
  • 蓝苹果:这是令人惊讶的,但它是一个蓝苹果
我希望使用哈希表和哈希函数根据键记录数据,并且我希望能够从表中重设数据

我知道使用哈希函数和哈希表,这里没有问题

但是

我希望给程序一个字符串,该字符串作为子字符串出现,并检索匹配键的数据

例如:

我必须给“红色”,并且必须能够得到

  • 红苹果:这棵树有红苹果
  • 曼尼雷德:她看到了曼尼雷德
作为输出

我必须给“苹果”
,而且必须能够得到

  • 红苹果:这棵树有红苹果
  • 蓝苹果:这是令人惊讶的,但它是一个蓝苹果
作为输出

我只能考虑在所有键都有匹配子串的情况下搜索它们,还有其他解决方案吗?如果我搜索每个查询的所有键字符串,那么使用哈希是不必要的,没有意义的,是吗?

但是,搜索子字符串的所有键是O(N),我希望用O(1)解决这个问题

通过哈希运算,我可以将一个键(例如“redapple”)哈希到例如943,将“maninred”哈希到例如332

查询人给字符串“red”我如何从943332中发现键有“red”子字符串?这超出了我的cs思维能力


谢谢你的建议,想法。

可能你应该使用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的情况下才行