【发布时间】:2012-05-18 18:49:34
【问题描述】:
我有数百个键,例如:
- 红苹果
- maninred
- 论坛
- 蓝苹果
我有与这些键相关的数据,数据是一个字符串,最后有相关的键。
- 红苹果:树有红苹果
- maninred: she-saw-the-maninred
- foraman:他们买了现在的foraman
- blueapple:它令人惊讶,但它是一个蓝苹果
我希望使用哈希表和哈希函数根据键记录数据,并且我希望能够从表中检索数据。
我知道使用哈希函数和哈希表,这里没有问题。
但是;
我希望给程序一个字符串,它作为子字符串发生并检索匹配键的数据。
例如:
我必须给“红色”并且必须能够得到
- 红苹果:树有红苹果
- maninred: she-saw-the-maninred
作为输出。
或
我必须给“苹果”并且必须能够得到
- 红苹果:树有红苹果
- blueapple:它令人惊讶,但它是一个蓝苹果
作为输出。
我只能考虑搜索所有具有匹配子字符串的键,还有其他解决方案吗?如果我搜索每个查询的所有关键字符串,则不需要使用散列,没有意义,是吗?
但是,搜索所有子字符串的键是O(N),我希望用O(1)解决这个问题。
通过散列,我可以散列一个键,例如“红苹果”到例如943,以及“maninred”,例如332。
查询人给出字符串“red”我如何从 943 和 332 中找出键具有“red”子字符串?这超出了我的 cs 思维能力。
感谢您的任何建议,想法。
【问题讨论】:
-
为什么你“期望使用哈希表”?后缀树会更合适。
-
另外,我相信你不能在
O(1)中这样做,因为对于字符串""(空字符串),你将不得不输出整个集合。另外,在谈到字符串时,读取字符串通常被视为O(|S|)而不是O(1) -
@amit 如果子字符串位于键的中间,后缀树会有所帮助吗?
-
感谢回复,考虑字符串内部的操作时间不是第一个问题。 @deathApril 是的,这是一个家庭作业,但我不想要解决方案。我想知道问q是否正确。 我只是想知道我应该在所有字符串中搜索给定的子字符串(查询参数/搜索输入),还是像预言机一样预测哈希码是否告诉我他们的关键字符串具有子字符串
-
@AdamMatan: 当然会 - 如果有一个字符串
s表示t是s的子字符串,那么t将是前缀 - 是 @987654329 的某些后缀@。您可以通过遍历树轻松发现它。