【问题标题】:string match by tokens - concept check通过标记匹配字符串 - 概念检查
【发布时间】:2012-07-25 08:44:02
【问题描述】:

此问题用于概念检查。我有一个字符串 000.00-010.0.0.0 我想从列表 {000.00-012.0.0.0 和 000.00-008.0.0.0} 中找到最接近的匹配项(在编辑度量中包含一个数字距离度量)我会喜欢以'012','010'和'008'作为标记并测量它们之间的距离。

字符串匹配的标准方法是查找每个字符位置的变化,对变化求和并返回一个距离。修改后的距离也将测量 CHARS 之间的 ASCII 距离 - G 离 E 比 D 更远。

要衡量 '012' 与 '008' 一样,需要将三个字符捆绑​​到一个令牌中。可以轻松测量此令牌的编辑距离和距离吗?由于删除了树数据库中的分隔符,问题似乎更加复杂。

我希望实际检查的建议解决方案是将“012”、“010”和“008”转换为单个 CHAR ASCII 符号,例如 )、* 和 +,测量字符距离和字符串编辑距离,然后在打印时转换回“012”、“010”和“008”。

示例字符串:MER99.C0.00M.14.006.00.060.350

还有通配符:

  • MER99.*.006.00.060.350
  • MER99.C0.00M.??.006.00.060.350

由于字符串长度相同(有些需要虚拟字符长度,'00M'实际上是'M')匹配是与汉明距离。

我不需要匹配算法、汉明距离方法、通配符或虚拟字符方面的帮助,我将其添加到问题的上下文中。现在,我将令牌视为单独的字符并获得良好的结果,但知道它们不如作为令牌处理时那样精确。限制因素可能是编码模式中的不一致。但是,我希望以此作为限制,而不是我的算法。

【问题讨论】:

  • 为什么要将'012'、'010'和'008'改为一个字符?你可以照你说的做,求和每个字符的差异(绝对值)... 例如:'012' - '010' : 0 [for '0'] + 0 [for '1'] + 2 [for '2' and '0'] = 2
  • '032' - '020' : 0 [for '0'] + 1 [for '3' and '2'] + 2 [for '2' and '0'] != 3 是 12 所以'+' less '*' = 12
  • 其实是12 * 1; 1 用于编辑,12 是“叶子”之间的距离
  • 我假设 '012' 是一个 3 位数的十进制数。您不能在单个字符中更改此数字:值将从 0 变为 999,这显然不适合 [0;255]。
  • 对于 12:100 * 0 [for '0' and '0'] + 10 * 1 [for '3' and '2'] + 1 * 2 [for '2' and '0']

标签: c++ token string-matching extended-ascii


【解决方案1】:

您的字符串包含字母数字字符,即以 36 为基数的数字。此外,这些字符被分组为“令牌”。它不能存储在char 中,但您可以将其存储在int 中。

您可以存储一对,而不是在树中存储整数,其中 char 告诉值的类型:

  • 0 表示数值
  • 1*
  • 2 代表 xxxx?(掩码)
  • 等等……

【讨论】:

  • 为什么转换成等效的 int 会有帮助?此外,字符分隔被删除以允许字符串匹配。我想它们可能会留在树中,会有'.'的节点
  • 不用写代码,我可以写。所以你会建立一个 int 树,然后比较它们以进行匹配?一个问题,我的结构的一部分是字母数字的——为了简化问题,我把它省略了。我没有重用 ASCII 表的“A”到“Z”。我可以将字母 char 转换为一些有代表性的 int 并使用您的方法。
  • 我在问题中添加了一个示例字符串
  • 我已经编辑了我的答案。您的问题中有一些不清楚的地方:树(您刚刚提到它)和“编辑距离”。我希望我更接近你想要的
  • 不,我仍在努力。我不能很好地解释它,所以谢谢你的回答。这是一个维基百科页面en.wikipedia.org/wiki/Approximate_string_matching
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2013-12-24
  • 2018-12-08
  • 1970-01-01
  • 2015-02-15
相关资源
最近更新 更多