在浏览器中使用哪种数据结构或算法来搜索单词?浏览器会构建一个trie或后缀树吗?
谢谢你 巴拉
答案 0 :(得分:3)
网页通常不够大,不需要复杂的搜索算法,至少在第一次扫描时是这样。我的意思是你可以在几毫秒内用简单的线性搜索找到任何单词。优化可以是在第一次扫描期间构建trie,然后将其用于后续搜索。
总的来说,我不认为这是浏览器算法中的一个重大问题。
答案 1 :(得分:3)
使用trie / suffix树搜索速度很快 - 但构建trie开始的速度要慢得多。这意味着它们只有在您希望对相同数据执行大量搜索时才有意义,因此您可以通过许多搜索来分摊构建trie的时间。
网页内的平均搜索次数可能是小数(即您希望用户在进行搜索之前加载多个页面,甚至一次)。即使您搜索某个页面,在同一页面中进行大量搜索也可能非常罕见。
这意味着线性搜索几乎总是比trie或后缀树基本上更多有效。我的猜测是,如果他们在简单的strstr()
调用之后再次优化它,那么他们只能在Boyer-Moore字符串搜索系列中找到它。考虑到您在网页中期望的搜索次数,这通常会在您完成trie的初始构建之前完成所有搜索,因此您可以开始搜索它
对于交互式使用,您主要关注的是产生足够快的结果以立即显现。这通常意味着在100ms左右的结果。通过Boyer-Moore-Horspool的良好实施,现在有足够的时间来搜索大量疯狂的文本,以包含在单个网页中(大约数百兆字节或千兆字节)。
如果您想进行测试,我建议Ray Gardner实施Boyer-Moore-Horspool(Bmhsrch.C,来自Bob Stout的Snippets网站)。我真的讨厌看到一个足够大的网页,使其占用甚至20毫秒,更不用说100(尽管我是第一个承认这个特殊的实现非常快)。 / p>
答案 2 :(得分:3)
要理解为什么线性扫描足够快,请考虑复杂的页面渲染(显然至少需要对HTML进行线性扫描)以及完成速度有多快。无论如何,我认为浏览器会花费更多的时间来突出显示出现的情况。
此外,搜索可以递增地进行。说,我正在寻找“算法”。当我输入“a”时,浏览器可能会找到(或异步开始搜索)字母“a”的出现,后续符号只会改进当前的结果。
答案 3 :(得分:0)
简单使用正则表达式就足够了。看看各种在线工具。