用于表示字符串中模式的数据结构

时间:2011-06-16 22:04:27

标签: java algorithm data-structures trie

我正在寻找一个好的数据结构来表示形式的字符串:

Domain:Key1=Value1,Key2=Value2...
  • 每个“域名”都可以包含以下模式字符 - *?* - 0个或更多字符,? - 0或1个字符)

  • 每个“密钥”都可以包含以下模式字符 - *?* - 0个或更多字符,? - 0或1个字符)

  • 每个“值”都可以包含以下模式字符 - *?* - 0个或更多字符,? - 0或1个字符)

示例:

JBoss:*
*:*
JBoss:type=ThreadPool,*
JBoss:type=Thread*,*
JB*:name=http1,type=ConnectionPool

如果您熟悉JMX ObjectName,那么基本上这就是ObjectName模式。

我正在寻找方法来轻松存储与每种模式相对应的规则,并能够快速删除,更新和添加新规则。

我最初使用的是Prefix Trie,但却遇到了模式字符*?

3 个答案:

答案 0 :(得分:1)

我认为最简单的方法是构建一个NFA类似的trie,它允许转换到多个状态。当然,这增加了另一个数据结构的复杂性,该数据结构在给定一组要匹配的字符的情况下映射到多个状态。例如,用你的例子:

JBoss:*
*:*
JBoss:type=ThreadPool,*
JBoss:type=Thread*,*
JB*:name=http1,type=ConnectionPool

假设您尝试匹配JBoxx:name=*

当您匹配子字符串JBo时,您需要一个数据结构来保存状态JBoJB*以及*,因为此时您有三个分支。当x进入时,您可以放弃JBo路线,因为它已经死路一条,并使用JB**。简单的实现是在任何给定的时间都有一组可能的匹配状态,并在每个状态上尝试下一个字符。你还需要一种方法来解决多个匹配(如本例所示) - 也许就像最长匹配一样简单?

当您将trie视为NFA而不是广为接受的DFA格式时,这一切似乎都有意义。希望有所帮助。

答案 1 :(得分:0)

我相信你想使用rope

答案 2 :(得分:0)

您可以查看其他帖子:Efficient data structure for word lookup with wildcards

或者此网站:Wildcard queries

第二个站点以“我们因此可以处理包含使用两个B树的单个*符号的通配符查询结束,正常的B树和反向B树。”。

这对你来说可能是最重要的,但值得一读。

祝你好运