Hash 需要一种有效的方法来搜索以下特定需求

Hash 需要一种有效的方法来搜索以下特定需求,hash,search,bloom-filter,Hash,Search,Bloom Filter,我必须在包含文件的目录中搜索给定的文件名(比如关键字)。如果要搜索的关键字很少,我可以使用常规搜索(比如创建位于指定目录中的文件名数组,然后使用给定的关键字搜索每个文件名)。因为我需要动态搜索大量的关键字,所以使用正则表达式进行搜索效率不高。我有两个想法: 1.使用哈希(但不清楚如何设计) 2.使用Bloom过滤器进行搜索(请谷歌,如果你不知道,它的工作非常有趣!):使用Bloom过滤器的问题是“可能出现误报,但不会出现误报”。我可能会错过一些结果……在搜索之前,请创建一个包含所有正匹配项的列表

我必须在包含文件的目录中搜索给定的文件名(比如关键字)。如果要搜索的关键字很少,我可以使用常规搜索(比如创建位于指定目录中的文件名数组,然后使用给定的关键字搜索每个文件名)。因为我需要动态搜索大量的关键字,所以使用正则表达式进行搜索效率不高。我有两个想法:

1.使用哈希(但不清楚如何设计)


2.使用Bloom过滤器进行搜索(请谷歌,如果你不知道,它的工作非常有趣!):使用Bloom过滤器的问题是“可能出现误报,但不会出现误报”。我可能会错过一些结果……

在搜索之前,请创建一个包含所有正匹配项的列表

创建trie需要O(n),其中n是字数

要搜索,请尝试将单词与trie匹配。查找是在O(m)中完成的,其中m是要查找的单词的长度


总运行时间:O(n+nm)=>O(nm)以查找所有单词。

在搜索之前,创建所有正匹配项的列表

创建trie需要O(n),其中n是字数

要搜索,请尝试将单词与trie匹配。查找是在O(m)中完成的,其中m是要查找的单词的长度


总运行时间:O(n+nm)=>O(nm)查找所有单词。

trie比单词列表“更紧凑”不是真的!尝试是相当低效的;这就是你及时获得储蓄的方式。如果搜索空间真的很大(OP没有说),那么你必须变得聪明,使用PATRICIA之类的东西,否则你就没有内存了。嘿Bens!!!谢谢你的主意。。。空间没有问题…这里只需要考虑时间…你的想法似乎适合我…有适合trie的java库吗?嗨,Jonathan!!!这里我指的“非常大”是指要搜索的文件名的数量非常大..trie并不是比单词列表“更紧凑”的说法!尝试是相当低效的;这就是你及时获得储蓄的方式。如果搜索空间真的很大(OP没有说),那么你必须变得聪明,使用PATRICIA之类的东西,否则你就没有内存了。嘿Bens!!!谢谢你的主意。。。空间没有问题…这里只需要考虑时间…你的想法似乎适合我…有适合trie的java库吗?嗨,Jonathan!!!这里我指的“非常大”是指需要搜索的文件名数量非常大。此外,bloom过滤器的目的是对确定的否定进行廉价测试;当布卢姆过滤器为正时,您始终必须进行搜索,这没关系。此外,布卢姆过滤器的目的是对确定的负进行廉价测试;当bloom过滤器为正值时,您始终必须执行搜索,这没关系。