控制台程序读取文本文件行,做Levenstein并输出一个文本文件

Console program to read text file lines, do Levenshtein and the output a text file

本文关键字:文件 输出 一个 文本 Levenstein 读取 程序 取文本 控制台      更新时间:2023-10-16

我有一个庞大的字符串文本文件,按行长降序排列。我想把整个东西加载到一个字符串数组中,对每个数组执行Levenstein,创建一个组UUID并将其放入一个数组中。因此,第二个数组将是一个哈希表,其中键是前一个字符串的内存地址,值是UUID。

我希望在对字符串进行迭代时执行指针运算,以获得最佳性能。

在反复执行了无数次levenstein-ga之后,我想填充另一个文本文件,其内容只是组的UUID、冒号和原始文本文件中的行。

我有维基上的Levenstein算法:

template<class T> unsigned int levenshtein_distance(const T &s1, const T & s2) {
    const size_t len1 = s1.size(), len2 = s2.size();
    vector<unsigned int> col(len2+1), prevCol(len2+1);
    for (unsigned int i = 0; i < prevCol.size(); i++)
            prevCol[i] = i;
    for (unsigned int i = 0; i < len1; i++) {
            col[0] = i+1;
            for (unsigned int j = 0; j < len2; j++)
                    col[j+1] = min( min( 1 + col[j], 1 + prevCol[1 + j]),
                                                            prevCol[j] + (s1[i]==s2[j] ? 0 : 1) );
            col.swap(prevCol);
    }
    return prevCol[len2];
}

我已经做了一些C++,一些C,加载了Obj-C。我使用的是Windows7。你建议我怎么做?什么样的字符串数组?如何转换文本文件中的文本字符串以供所提供的函数使用?

我基本上是在寻找尽可能多的技巧,因为字符串在C++中让我感到困惑。哦,C++也一样!

感谢

对于纯粹的访问时间,您将很难完成对内存的完全读取,然后通过单次遍历对其进行索引,构建指针列表,并在遇到的每个CR/LF处硬写一个null终止符。行号将是存储所有指针的容器的索引,为此我可能会使用std::deque<>

提升::伙计们可能会把它做得更远,但对于快速访问来说,它很难击败一大堆内存和大量索引它的指针。当然,这整件事都假设你可以将其放入内存。如果你做不到,这会变得更加复杂,但如果你可以(并且可以假设你总是可以)malloc/walk和terminate/push-ptr进入deque似乎很干净。为了真正让它冒烟,我还会用指针存储每个字符串的长度,所以你的std::deque<>应该是struct { char* ptr; size_t len; }。这样做将消除大量不需要的strlen()等。它还将消除对null终止任何内容的需要。