匹配最长的前导子串

时间:2015-08-21 07:39:10

标签: algorithm haskell search

我希望将列表的最佳匹配与列表集合一起返回。

如果长度为n的集合中的列表与x的前n个元素匹配,则

x与集合中的列表匹配。

e.g。 [1,2,3][1,2]匹配,但[1,2][1,2,3]不匹配。

我希望函数返回" best"匹配,即最长的匹配。

e.g。

bestMatch [1,2,3,3] [[1],[1,2,3],[1,2],[1,2,3,2],[1,2,3,4]] == Just [1,2,3]

显然,这里的列表并不是最好的数据结构,我宁愿使用标准结构和搜索,而不是自己动手,任何想法我应该使用什么以及如何使用?

我不认为哈希表会起作用,因为匹配不准确。然后我考虑搜索有序的树,但它有一个问题,如果我搜索[1,2,100],我会得到[1,2,99][1,2,98],...等正确答案[1,2]。可以使用散列哈希(以及树上的等等),但这似乎是很多开销。

(基于线性搜索列表的实现是here

1 个答案:

答案 0 :(得分:3)

trie 将是一个很好的解决方案。在您的情况下,值只是(),标记给定节点对应于列表的末尾。然后,给定一个列表,你将尽可能地向下遍历trie,最后遇到的值将标记最长的匹配列表。

ByteString中基于Data.Trie的trie提供match,这似乎正是您正在寻找的(如果8字节字符键对您来说已足够):< / p>

-- | Given a query, find the longest prefix with an associated value in 
-- the trie, returning that prefix, it's value, and the remaining string.
match :: Trie a -> ByteString -> Maybe (ByteString, a, ByteString)

还有另一个包list-tries,它有更多通用键。我不确定上面是否有类似match的确切函数,但绝对可以实现一个。