假设一组(Unix)路径,例如
/usr
/lib
/var/log
/home/myname/somedir
....
给定路径/some/path
,我想测试这个/some/path
是否与上面路径中的任何一个匹配,并且,“匹配”,我的意思是
/some/path
正好是上述路径之一,或我知道我可以通过/
分割路径并逐个进行字符串匹配,但我想这么快,可能是通过使用一些散列技术或类似的东西,这样我可以转换这些字符串匹配一些整数匹配。
有没有算法?或者,有没有证据证明它没有?
答案 0 :(得分:1)
由于路径通常不是很深,您可以负担得起存储所有可能的匹配子路径。
对于输入集中的每个路径,将其每个子路径添加到哈希表中。例如,这个集合:
/usr
/lib
/var/log
/home/myname/somedir
将生成此表:
hash0 -> /usr
hash1 -> /lib
hash2 -> /var
hash3 -> /var/log
hash4 -> /home
hash5 -> /home/myname
hash6 -> /home/myname/somedir
现在搜索查询归结为在此哈希表中找到完全匹配。只有在哈希冲突的情况下才需要进行字符串比较。
这种方法的一个主要缺点是,在一般情况下,它需要超线性的内存量(相对于输入集的大小)。
考虑600个字符长的路径:
[400characterlongprefix]/a/a/a/...[100 times].../a/a/a/
相应的表格总共包含50500个字符:
hash0 -> [400characterlongprefix]
hash1 -> [400characterlongprefix]/a
hash2 -> [400characterlongprefix]/a/a
...
hash100 -> [400characterlongprefix]/a/a/a/...[100 times].../a/a/a/
预计算步骤
示例强>
输入集:
/usr
/var/log
/home/log/usr
组件索引:
usr -> 0
var -> 1
log -> 2
home -> 3
前缀树:
0 // usr
1 -> 2 // var, log
3 -> 2 -> 0 // home, log, usr
搜索查询