【发布时间】:2011-02-02 00:33:57
【问题描述】:
我有一个包含这么多字符串的数组,想在上面搜索一个模式。 这种模式可以有一些“。”匹配(每个)1 个字符(任意)的通配符。
例如:
myset = {"bar", "foo", "cya", "test"}
find(myset, "f.o") -> returns true (matches with "foo")
find(myset, "foo.") -> returns false
find(myset, ".e.t") -> returns true (matches with "test")
find(myset, "cya") -> returns true (matches with "cya")
我试图找到一种快速实现该算法的方法,因为myset 实际上是一个非常大的数组,但我的想法没有一个具有令人满意的复杂性(例如O(size_of(myset) * lenght(pattern)))
编辑:
myset 是一个巨大的数组,里面的单词并不大。
我可以做一个缓慢的预处理。但是我会有很多find() 查询,所以find() 我希望find() 尽可能快。
【问题讨论】:
-
每个模式一个或多个通配符?
-
套装固定了吗?您可以从中构建一个 trie 并将模式与 trie 匹配。
-
什么语言?您可以使用现有的正则表达式库吗?
-
@Justin:问题不在于正则表达式。问题是将正则表达式应用于集合的所有单词。问题不是匹配单词而是减少匹配的可能单词集合。
-
@Murilo:您不必为所有单词都这样做。我猜较长的单词比较少见,所以你可以选择 8 个字母或更少的单词,然后简单地搜索其余的单词(你必须根据你的字典来决定)。可能有很多重复(取决于字典),这可能会节省大量内存。例如 .e.t 将来自 best、test、rest、lest 等。因此,即使所有这些词都生成 2^4 模式,但总数很少。您甚至可以尝试为前缀生成模式并在“尾部”附近切换到回溯。权衡取舍取决于您拥有的数据。
标签: algorithm string search complexity-theory big-o