我希望将列表的最佳匹配与列表集合一起返回。
如果长度为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)
答案 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
的确切函数,但绝对可以实现一个。