Algorithm Firefox的“很棒”工具栏如何匹配字符串?
问题是Firefox3如何进行字符串匹配以查找匹配的条目。每个条目上的子字符串匹配可能很慢。什么算法可以用于在任何位置快速匹配?我认为这取决于底层存储:Firefox存储您访问的页面的SQLite数据库提供了一个快速的子字符串比较功能Algorithm Firefox的“很棒”工具栏如何匹配字符串?,algorithm,firefox,string,Algorithm,Firefox,String,问题是Firefox3如何进行字符串匹配以查找匹配的条目。每个条目上的子字符串匹配可能很慢。什么算法可以用于在任何位置快速匹配?我认为这取决于底层存储:Firefox存储您访问的页面的SQLite数据库提供了一个快速的子字符串比较功能 我认为Firefox会向数据库发出SQL查询。这相当快,因为数据库缓存在内存中。awesomebar通过一种称为的算法来建议URL 根据Mozilla开发者网站: 单词frecenty本身是单词frequency和recentency的组合 进行快速子字符串匹配的
我认为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、不区分大小写的方式对每个标记(而不仅仅是单词边界)测试可搜索文本。
希望这能以一种可以理解的方式解释它如果你想在单词的中间找到匹配,这是必要的。如果你对从一个单词的开头开始匹配感到满意,那么一个普通的倒排索引就足够了。根据我自己的测试,“firefo”会以非常快的速度递增地显示结果,而“irefo”则需要一段时间。我猜它最初使用的是反向索引,如果没有返回任何内容,它会对整个数据库进行强制扫描。虽然这是一个很好的解释,但Firefox完全不是这样做的。对于大多数用户来说,内存使用量和磁盘使用量都相当大。假设1000个历史记录条目非常保守,典型的url长度为100-1000个字符,1000000-10000000个数组条目。有了这些数字,您就可以看到表的最小容量为50MB。除非您在90年代陷入困境,否则50MB不会很大。1000万个URL每个超过100个字符的长度是一个非常乐观的限制-以每秒1个URL访问1000万秒需要115天。此外,如果不把它们存储在某个地方,你建议Firefox做什么呢?50MB是保守的估计,可能看起来不多。然而,当你
仅应用程序[通常使用大约100-200MB][1],内存使用量将增加50-25%。人们已经抱怨Firefox占用了太多内存。所有这些仍然不能改变Firefox的查找方式并非如此的事实。[1] :这只是数据的排序方式,与显示的结果几乎没有关系。是的,但问题自最初发布以来已更改。所以我的答案和原来的问题有关,可能看起来有点不对劲……这根本不对。数据实际上是从SQLite获得的,但是匹配是用一种完全不同的算法完成的。