【问题标题】:Resolving ambiguous categories in an ordered list解决有序列表中的模糊类别
【发布时间】:2010-10-11 08:54:05
【问题描述】:

让我们举一个具体的例子,希望我能清楚。假设月份的(有序)列表:

一月

(代表月份的整数,从零开始),这样

一月是 0,二月是 1,...,十二月是 11。

现在假设我无法访问月份的全名,并得到以下列表,其中月份已缩短为首字母,e 代表一个空类别,例如这个:

e, F, e, e, e

如果我建立一个“明确的月份”列表(f:1, s:8, o:9, n:10, d:11),我可以通过首先计算第一个类别(使用减法和 mod 12),然后从那里写下其余部分。但是,假设我得到了列表

e, A, e, e, J, e

然后我可以(直观地)计算出虽然 A 是模棱两可的(可能是四月或八月),但在这种情况下它只能是四月,因为八月没有任何 Js 在 2 个类别之后跟随它。一旦找到这个,我就可以再次从头计算一切。

最后,我的问题是:这个问题是否有解析解决方案(函数、算法),还是我唯一希望使用蛮力来定义每个潜在关系?对于某些示例,没有消歧算法/函数可以工作:考虑我有一个 J 后跟 11 个 e 的情况,然后是一个 J em> 后跟 11 个 e ... 由于中间有一年,我无法将 J 区分为 1 月、6 月或 7 月。

答案:我最终编写了 Il-Bhima 的答案,因为特别是对于这种情况,正则表达式是可以的,即使在更高的运行时间 O(mn) 时也是如此。但是,我接受了 Ben 的答案作为正确答案,因为它包含了其他答案(提到了正则表达式解决方案),但也提出了使用 KMP 算法 O(m+n) 的更好方法,尽管这是针对更大数量的字符串匹配模式。谢谢大家。

【问题讨论】:

    标签: algorithm math function


    【解决方案1】:

    我不确定这是否正是您要查找的内容,但您可以使用修改后的KMP string search algorithm 来解决此问题。

    修改将匹配任何内容与空类别。它甚至可以为您找到所有可能的值,例如您提到的带有 11 e 的 J。

    您还可以使用finite state machine 来确定可能性,这就是regular expression 的作用。

    【讨论】:

    • 谢谢,本。您能否详细说明您如何看待 KMP 会为我的“J”示例找到值?谢谢!
    【解决方案2】:

    最简单的方法是使用正则表达式。假设您要匹配e, A, e, e, J, e

    构造如下正则表达式:r = ".A..J."

    c 成为我们的控制字符串:

      c = "JFMAMJJASONDJFMAMJJASOND"
    

    现在我们在字符串c 中搜索r 的所有匹配项,其中匹配项的起始索引在c 的前半部分内。

    一般来说,这可能不是最有效的方法。最幼稚的解决方案,尝试将模式与控制字符串"JFMAMJJASOND" 的每个循环移位匹配在O(nm) 时间运行,其中n 是模式的长度,m 是控制字符串的长度(在我们的例子中是JFMAMJJASOND)。

    【讨论】:

      【解决方案3】:

      对于一般情况,我们可以在 Il-Bhima 的回答的基础上再做一点。首先,我们认识到唯一真正模棱两可的 A、M 或 J 对是两个相隔六个月的 J 或两个相隔一年的相同字母。任何其他组合都将在控制字符串中产生明确的匹配。 (我建立了一个包含所有可能组合的表格来证明这一点。)

      因此,从整个起始列表中,您只需要两个月,其距离 mod 12 不是 0 或 6。然后您可以构建一个小的正则表达式来匹配控制字符串。或者,您可以构建一个查找表,其中包含有序对和月份之间的距离。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-07
        • 2014-03-16
        • 1970-01-01
        • 2017-12-16
        • 2021-10-15
        • 1970-01-01
        • 2010-11-07
        相关资源
        最近更新 更多