【问题标题】:Formal approach for text processing文本处理的形式化方法
【发布时间】:2013-03-15 17:23:20
【问题描述】:

在一次编程面试中,我被问到下一个问题:

编写一个程序,计算输入流中的字数和行数。
假设您有一个具有 nextChar() 方法的阅读器。

乍一看,它看起来很简单。但后来你意识到,你需要处理很多状态,比如:

  • 连续的字/行分隔符
  • 不同的词尾条件 - 单词分隔符或行分隔符或 EOF
  • 以单词分隔符开头的新字符串

在面试中,我想出了一个带有许多 if-else 和标志的意大利面条代码。

但是我认为对于这类问题应该有一个正式的方法,它可以让你保证你处理了所有可能的情况,并且可以给出一个结构化的解决方案。

我认为这可能来自自动机理论或编译器理论(我以前从未深入研究过这两个领域中的任何一个)。

所以,如果您认识到上述问题中的某种类型的问题,或者您知道哪种理论涵盖了此类问题,请告诉我。

【问题讨论】:

    标签: algorithm computer-science compiler-theory automata


    【解决方案1】:

    Finite state machines.

    这本质上是一个小的lexing 任务。解决方案永远不会很漂亮,但是如果您按照以下方式编写代码,您可以对正确性充满信心:

    curState <- NONE
    while(c <- getChar)
        switch(curState) {
           case NONE:
               switch(c) {
                   // ....
               }
               break;
           // .....
        }
    }
    

    您也可以使用数据结构来存储转换函数(给定一个状态和一个字符,下一个状态是什么?)但对于您的情况,最好只编写代码。

    ...不要忘记您的文本编码! UTF-16,对吧? :)

    您可能想研究 Unix wc 实用程序的实现:

    这些会比你在面试中做的更精致和更有特色,但无论如何都很高兴看到。

    【讨论】:

    • 我们假设 nextChar() 方法返回 UTF-8 字符,如果 EOF 则返回 null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多