滚动输出的文本差异

时间:2011-05-27 06:35:16

标签: c++ algorithm text

我有从滚动输出捕获文本的代码,我正在寻找一种算法(使用C ++ / Qt),可以告诉我哪些行是新的。 注意:新行只会添加到最后。

因此,在第一次捕获时,我可能会有以下内容:

hello world
some more text
hello world
some text

第二次捕获可能有:

hello world
some text
yet more text
hello world

所以我希望算法返回我有两个新行:

yet more text
hello world

如果可能的话,如果它可以从最后一行开始并在它到达已经处理的行时终止,那么它将有助于性能。但我认为这可能是不可能的,因为可能存在重复的行。

3 个答案:

答案 0 :(得分:0)

嗯,你说它的滚动,你正在使用OCR,那么你是否也可以在滚动窗口中捕捉滚动小部件的大小,并检查它与你记录的行一起?

或者,您可以将dll挂钩到生产者程序中,以便在输出新行时发出信号吗?或直接将其输出管道输入您的产品?

答案 1 :(得分:0)

对于您的特殊情况,我会考虑一个简单的基本循环内循环算法。我不认为性能确实是一个问题(不是那么多行,我也认为OCR是主要部分)因此算法应该易于阅读和健壮。

伪代码中的一种可能算法:

numberOfNewLines = 0
while numberOfNewLines <= numberOfTotalLines do
    compare lines 
        [1..numberOfTotalLines-numberOfNewLines] of textNew
        with lines [1+numberOfNewLines..numberOfTotalLines] of textOld
    if identical then exit while
    numberOfNewLines++
end while

只要一行不同,您就可以打破比较,但算法的行数仍为O(N^2)

然后您可以从numberOfNewLines的末尾输出最后textNew。正如评论中所提到的,你当然不会发现一些边缘情况,比如“10000次'ABC',然后是1次'DEF'”,其中大部分行'ABC'将被忽略。

答案 2 :(得分:0)

我已针对多个测试用例对此进行了测试,并且到目前为止一直有效:

QStringList scrollDiff(const QStringList& oldLines, const QStringList& newLines)
{
    if (oldLines.empty()) {
        return newLines;
    }

    if (oldLines.size() < newLines.size()) {
        return newLines.mid(oldLines.size());
    }

    /*
     * Note: oldLines.size() == newLines.size()
     */
    int i;
    for (i = 0; i < oldLines.size() && oldLines[i] == newLines[i]; ++i);

    if (i == oldLines.size()) {
        return QStringList();
    }

    // Remove lines from oldLines that are no longer shown
    int j = oldLines.indexOf(newLines[i]);
    if (j == -1) {
        return newLines;
    }
    QStringList commonLines = oldLines.mid(j - i);

    return newLines.mid(commonLines.size());
}