查找某些文本文件之间的相似性百分比

时间:2016-11-08 05:25:01

标签: c++ algorithm file logic standard-deviation

我在C ++中创建了一个程序,它根据整数变量v的值序列生成一个文本文件,该变量在1到100之间变化。文本文件格式如下:

file1.txt
1 2 3 4 5

file2.txt
4 5 6 7 8

file3.txt
8 4 5 7 1

.......

说,我已经生成了100个文本文件(file1.txtfile100.txt)。我想逐个检查文本文件,找到它们之间的相似性百分比。 我不想检查所有100个文本文件,而是当我为某些连续文件获得或多或少相似的结果时,我想要停止检查。

如何进行相似性检查?比如说,我已经计算了file1和file2之间的相似性百分比。现在我将计算file2和file3或file1和file3的相似性,依此类推? 更准确地说,执行此检查的逻辑是什么?

1 个答案:

答案 0 :(得分:0)

根据您的评论,相似度是根据公共位数计算的,无论其顺序如何。

两个文件之间的相似性

最简单的方法是将load两个连续文件(比如两个开放ifstream sfs1sts2)分成两个向量:

std::vector<int> v1{1,2,3,4,5,6,7,8};

    copy(istream_iterator<int>(sfs1), istream_iterator<int>(), back_inserter(v1));
    copy(istream_iterator<int>(sfs2), istream_iterator<int>(), back_inserter(v2));

Sort向量:

    sort(v1.begin(), v1.end()); 
    sort(v2.begin(), v2.end()); 

然后使用标准算法获取两个排序向量的intersection

    set_intersection(v1.cbegin(), v1.cend(), v2.cbegin(), v2.cend(), back_inserter(sim));

然后您只需要查找尺寸:

    cout << "Similar elements: " << sim.size()<<endl; 
    cout << "Similarity coefficient: "<< (double)sim.size()/max(v1.size(), v2.size())*100 <<"%"<<endl;  

现在你必须添加一些错误处理,以防两个向量都为空(这将导致除以0)。

此处online demo使用字符串流而不是文件流:

如何处理多个文件

根据您的问题,您不需要在每个可能的文件对中查找相似之处,而只需在后续文件之间查找。

因此,在比较了两个第一个文件后,您只需将v2复制到v1,将下一个文件读入v2并对其进行排序。并计算新的相似度。

你还需要一个计数器来计算连续的近距离匹配。每次相似度超过某个阈值(例如90%)时递增它。每次相似度低于此值时将其重置为0。一旦你的计数器达到你期望的连续近距离匹配的数量,就停止:-)