Я сделал программу на 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 и так далее?
Чтобы быть более точным, какова логика выполнения этой проверки?
Согласно вашим комментариям, степень сходства рассчитывается на основе общего количества цифр, независимо от их порядка.
Самый простой способ сделать это, было бы нагрузка два последовательных файла (скажем, два открытых 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(v1.begin(), v1.end());
sort(v2.begin(), v2.end());
Затем возьмите пересечение из двух отсортированных векторов с использованием стандартного алгоритма:
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 здесь).
Здесь онлайн демо используя строковые потоки вместо файловых потоков:
Согласно вашему вопросу, вам не нужно искать сходства в каждой возможной паре файлов, а только между последующими файлами.
Итак, после того, как вы сравнили два первых файла, вам просто нужно скопировать v2
в v1
, прочитайте следующий файл в v2
и сортируй это. И рассчитать новое сходство.
Вы также должны иметь счетчик для подсчета последовательных ближних матчей. Увеличивайте его каждый раз, когда сходство превышает определенный порог (например, 90%). Сбрасывайте его на 0 каждый раз, когда сходство ниже. Как только ваш счетчик достигнет ожидаемого количества последовательных матчей, просто остановитесь 🙂
Других решений пока нет …