我在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.txt
到file100.txt
)。我想逐个检查文本文件,找到它们之间的相似性百分比。
我不想检查所有100个文本文件,而是当我为某些连续文件获得或多或少相似的结果时,我想要停止检查。
如何进行相似性检查?比如说,我已经计算了file1和file2之间的相似性百分比。现在我将计算file2和file3或file1和file3的相似性,依此类推? 更准确地说,执行此检查的逻辑是什么?
答案 0 :(得分:0)
根据您的评论,相似度是根据公共位数计算的,无论其顺序如何。
最简单的方法是将load两个连续文件(比如两个开放ifstream
sfs1
和sts2
)分成两个向量:
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。一旦你的计数器达到你期望的连续近距离匹配的数量,就停止:-)