【发布时间】: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.350MER99.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