Algorithm Firefox的“很棒”工具栏如何匹配字符串?

Algorithm Firefox的“很棒”工具栏如何匹配字符串?,algorithm,firefox,string,Algorithm,Firefox,String,问题是Firefox3如何进行字符串匹配以查找匹配的条目。每个条目上的子字符串匹配可能很慢。什么算法可以用于在任何位置快速匹配?我认为这取决于底层存储:Firefox存储您访问的页面的SQLite数据库提供了一个快速的子字符串比较功能 我认为Firefox会向数据库发出SQL查询。这相当快,因为数据库缓存在内存中。awesomebar通过一种称为的算法来建议URL 根据Mozilla开发者网站: 单词frecenty本身是单词frequency和recentency的组合 进行快速子字符串匹配的

问题是Firefox3如何进行字符串匹配以查找匹配的条目。每个条目上的子字符串匹配可能很慢。什么算法可以用于在任何位置快速匹配?

我认为这取决于底层存储:Firefox存储您访问的页面的SQLite数据库提供了一个快速的子字符串比较功能


我认为Firefox会向数据库发出SQL查询。这相当快,因为数据库缓存在内存中。

awesomebar通过一种称为的算法来建议URL

根据Mozilla开发者网站:

单词frecenty本身是单词frequency和recentency的组合


进行快速子字符串匹配的通常方法是创建一个数据结构,其中包含要搜索的所有字符串的所有后缀。根据组织的不同,这可以称为后缀树或后缀数组。例如,如果有1000个字符串,每个字符串长度为50个字符,则有1.000 x 50个非平凡的后缀,即后缀数组将有50.000个条目

然后,要进行匹配,需要执行二进制搜索if array或tree搜索if tree,以查找数据结构中的所有后缀,这些后缀的开头与搜索框中写入的字符串匹配。因为它是匹配后缀的开始,所以可以使用标准的搜索程序进行二进制搜索、树下降以快速获得结果。每个后缀都链接到它出现的字符串

示例:您有两个字符串CAT和DOT。您的后缀数组如下所示:lexiographic=字母顺序:

#1 AT  --> CAT
#2 CAT --> CAT
#3 DOT --> DOT
#4 OT  --> DOT
#5 T   --> DOT, CAT
请注意,有六个后缀,但其中两个是CAT和DOT中最后一个相同的T,并且都由相同的条目5表示

现在,当用户在搜索中键入,例如应该匹配点的OT时,您可以在日志时间内执行简单的词汇顺序查找,因为您现在正在后缀数组中搜索开始匹配项


当搜索模式不包含通配符时,这是快速文本搜索的基本原理。

Firefox 3.0中位置栏的算法有点复杂。它将从Firefox 3.5和更高版本的两个不同查询中获取数据:

对于第一个查询,它检查moz_inputhistory表,查看当前搜索字符串是否存储在该表中。这些结果按排名进行排序,排名是一个决定最近使用它的次数的数字。这个数字每天下降一次。此搜索使位置栏随着时间的推移与您在中选择的内容相适应

在Firefox3.5及更高版本中,它会检查moz_关键字表中是否有与搜索文本完全匹配的关键字的书签

最后一个查询将遍历moz_places中的每个条目,其中包括所有历史访问和书签。这些结果按顺序排列

对于这三种情况,下面的算法用于匹配标记、标题和下面称为searchable text的url。这有点难以用语言解释,因此可能更容易理解

搜索字符串被分成由空格决定的标记,每个非空格单词都是一个标记。 对于每个标记,开始以Unicode、不区分大小写的方式比较可搜索文本的每个字符和标记,直到完全匹配为止。如果一组字符不匹配,请转到可搜索文本中的下一组,然后重试。 如果我们匹配任何一个可搜索文本,它将显示在位置栏中。 如果我们没有足够的结果,默认值为12,那么我们将在每次书签和历史访问中重新搜索查询,并以Unicode、不区分大小写的方式对每个标记(而不仅仅是单词边界)测试可搜索文本。
希望这能以一种可以理解的方式解释它仅应用程序[通常使用大约100-200MB][1],内存使用量将增加50-25%。人们已经抱怨Firefox占用了太多内存。所有这些仍然不能改变Firefox的查找方式并非如此的事实。[1] :这只是数据的排序方式,与显示的结果几乎没有关系。是的,但问题自最初发布以来已更改。所以我的答案和原来的问题有关,可能看起来有点不对劲……这根本不对。数据实际上是从SQLite获得的,但是匹配是用一种完全不同的算法完成的。