我有一个按行长度递减排序的大量字符串文本文件。我想将整个事物加载到一个字符串数组中,在每个字符串上执行Levenshtein,创建一个组UUID并将其放入一个数组中。因此第二个数组将是一个哈希表,其中键是前一个字符串的内存地址,值是一个UUID。
我想在迭代字符串时执行指针运算以获得最佳性能。
在迭代地执行levenshtein ga-zillions次之后,我想填充另一个文本文件,其内容很简单,组的UUID,冒号和原始文本文件中的行。
我有来自wikibooks的levenshtein算法:
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。我正在使用Windows 7.您如何推荐我这样做?什么样的字符串数组?如何从文本文件转换文本字符串以供所提供的函数使用?
我基本上都在寻找尽可能多的提示,因为字符串让我在C ++中感到困惑。哦,C ++也是如此!
感谢
答案 0 :(得分:0)
对于纯粹的访问时间,您将难以击败完整的读取内存,然后通过单次传递对其进行索引,构建指针列表并在遇到的每个CR / LF上硬编写空终止符。行号将是您存储所有指针的容器的索引,为此我可能会使用std::deque<>
。
boost :: guys可能会进一步提升它,但是为了快速访问它很难击败一大堆内存和一大堆指针。当然,这整个事情假设您可以将拟合到内存中。如果你不能,这会变得更加复杂,但是如果你能(并且可以假设你总是可以),malloc / walk-and-terminate / push-ptr-into-deque看起来很干净。为了让它真正吸烟,我还会用指针存储每个字符串的长度,因此std::deque<>
将是struct { char* ptr; size_t len; }
。这样做可以消除大量不需要的strlen()等。它还可以消除无效终止任何内容的需要。