Algorithm 最短前缀匹配算法?

Algorithm 最短前缀匹配算法?,algorithm,Algorithm,给定字符串p和字符串列表,查找前缀为p的最短字符串 我知道暴力手段,但什么是最佳手段 e、 g 应该返回“foobar1”您可能已经想到的简单方法基本上就是在每次传递后检查字符串的长度 使用psuedo-C#: int-length=0,索引; 字符串p=“foo-bar” 字符串[]列表=新字符串[]{“foo bar 1”, “foobar foobar”, “巴富巴富巴”}; for(int i=0;i

给定字符串p和字符串列表,查找前缀为p的最短字符串

我知道暴力手段,但什么是最佳手段

e、 g


应该返回“foobar1”

您可能已经想到的简单方法基本上就是在每次传递后检查字符串的长度

使用psuedo-C#:

int-length=0,索引;
字符串p=“foo-bar”
字符串[]列表=新字符串[]{“foo bar 1”,
“foobar foobar”,
“巴富巴富巴”};
for(int i=0;i
如果您已经有了一个搜索空间(在您的例子中,是一个相对恒定的
列表),那么生成一个trie或其他合适的结构将有助于进行大量搜索。从Wikipedia开始,Wikipedia详细解释了这一点,让您开始:

下面是上面文章中使用单词的图片(它很容易扩展到使用任何类型的字符串,甚至是非字符串):

本文提供了一些与其他合适结构的性能比较,这对您的案例很有帮助


请注意,如果列表变化足够大,那么这种方法的回报可能会减少,或者与暴力相比,您的性能甚至会更差

如果需要为单个
p
运行它,则直接方法:

  • 查找
    lst
    中以
    p开头的所有字符串
  • 从中找出最短的
  • 它已经是最佳的,在时间上是
    O(n)
    ,在空间上是
    O(1)
    ,在Python中是:

    shortest_with_prefix = min((s for s in lst if s.startswith(p)), key=len)
    
    from pytrie import StringTrie # pip install pytrie
    
    trie = StringTrie.fromkeys(lst)
    shortest_with_prefix = min(trie.iterkeys(prefix=p), key=len)
    
    如果有多个
    p
    ,但
    lst
    是相同的,则可以将
    lst
    预处理到前缀树()中,以加快多个搜索,在Python中:

    shortest_with_prefix = min((s for s in lst if s.startswith(p)), key=len)
    
    from pytrie import StringTrie # pip install pytrie
    
    trie = StringTrie.fromkeys(lst)
    shortest_with_prefix = min(trie.iterkeys(prefix=p), key=len)
    

    请解释为什么它不会返回
    “foo bar 1”
    。如果
    列表
    包含
    “foo b”
    ,该怎么办?