String 高效搜索大型字符串列表

String 高效搜索大型字符串列表,string,algorithm,search,String,Algorithm,Search,我有一个很大的字符串列表,需要iPhone/Android应用程序的用户进行搜索。字符串是按字母顺序排序的,但这实际上并不完全有用,因为如果搜索查询位于字符串中的任何位置,而不仅仅是字符串的开头,则应在结果中包含字符串。当用户键入他们的搜索查询时,应更新搜索以反映他们当前输入的结果。(例如,如果他们键入“cat”,则应在键入时显示“c”、“ca”和“cat”的结果) 我目前的做法如下: 我有一堆“搜索结果”,一开始是空的。如果用户键入某些内容以延长搜索查询的时间,我会将当前搜索结果推送到堆栈上,

我有一个很大的字符串列表,需要iPhone/Android应用程序的用户进行搜索。字符串是按字母顺序排序的,但这实际上并不完全有用,因为如果搜索查询位于字符串中的任何位置,而不仅仅是字符串的开头,则应在结果中包含字符串。当用户键入他们的搜索查询时,应更新搜索以反映他们当前输入的结果。(例如,如果他们键入“cat”,则应在键入时显示“c”、“ca”和“cat”的结果)

我目前的做法如下:

我有一堆“搜索结果”,一开始是空的。如果用户键入某些内容以延长搜索查询的时间,我会将当前搜索结果推送到堆栈上,然后仅搜索当前搜索结果以查找新的搜索结果(在这种情况下,某些内容不可能位于完整字符串列表中,但不在当前结果中)

如果用户点击backspace,我只需要从堆栈中弹出搜索结果并恢复它们。这几乎可以在瞬间完成

这种方法对于“向后”搜索(使搜索查询更短)和搜索查询已经足够长以致结果数量较低的情况非常有效。但是,它仍然必须在O(n)时间内搜索用户键入的前几个字母的完整字符串列表,这相当慢

我考虑过的一种方法是预先编译所有可能的搜索查询的结果列表,包括2或3个字母。这种方法的问题是需要26^2或26^3个这样的列表,并且会占用相当大的空间


您能想到的任何其他优化或替代方法?

我注意到,当只按下1或2个字符时,Google和我想象的其他人并没有提供完整的列表。在您的情况下,也许一个好的起点是仅当用户键入至少3个字符时才开始填充搜索查询结果


对于更高版本,如果重要的话,你可以借鉴谷歌的做法,进行更复杂的处理:跟踪以前用户选择的实际条目,并按频率排序。然后,每天在服务器上运行一个CRON作业,用一个从每个字母开始的前10个条目填充一个小数据库表,如果只有1个或2个字母被按下,使用这个小表的结果而不是扫描完整的列表。

< P>您应该考虑使用A来生成预先计算的列表。我不确定在子字符的基础上显示“c”、“ca”和“cat”的结果是否是个好主意。例如,假设用户正在搜索单词“eat”。您的算法必须找到所有包含“e”,然后是“ea”,最后是“eat”的单词;其中大部分对用户没有任何用处。对于一个手机应用程序来说,如果你在文字的基础上使用它可能会更好。多字字符串可以标记,因此在“大桩”中搜索“桩”可以正常工作,但不搜索“take”。

您可以使用压缩后缀树

可能重复您询问的查询预测?i、 e.如果用户类型为
c
,您应该如何预测
cat
将成为查询?还是要搜索所有的
c
ca
cat
,作为用户类型?查询预测会被视为“替代方法”吗?还是说这与你想要实现的目标相差太远?我没有一个集中的服务器,所有的东西都在人们的手机上本地运行。我已经限制了至少3个字符。这将占用大量的空间,这是我在iPhone或Android上做不起的。