我有从滚动输出捕获文本的代码,我正在寻找一种算法(使用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
如果可能的话,如果它可以从最后一行开始并在它到达已经处理的行时终止,那么它将有助于性能。但我认为这可能是不可能的,因为可能存在重复的行。
答案 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());
}