Делая проект в колледже, я столкнулся со следующей проблемой: у меня есть две карты (Kmer1 и Kmer2), которые состоят из строки (ключа) и int (значения). Я должен рассчитать расстояние , которое следует этой формуле
[1-(I/U)]*100
Where...
...U = the sum of all int values inside Kmer1 U Kmer2
...I = the sum of all int values inside Kmer1 ∩ Kmer2
Consider that...
... The U and ∩ are made evaluating the keys (strings)
... When an element is in both maps:
- At the Union we add the one with higher int value
- At the Intersection we add the one with lower int value
Пример:
Kmer1 = AAB¹ AAC¹ AAG³
Kmer2 = AAG¹ AAT² ABB¹
Union = AAB¹ AAC¹ AAG³ AAT² ABB¹ U= 8
Intersection = AAG¹ I= 1
Distance = 87.5
Время кода! Я пытался решить это, но все решения вроде .. частично правильные, не все случаи покрыты. Поэтому, когда я попытался их охватить, я закончил бесконечными циклами, ростом исключений, длинными длинными гнездами if-else (которые были ужасными ..) в любом случае, вот наименее худшая и неработающая попытка:
Настройка:
Species::Kmer Kmer1, Kmer2; //The two following lines get the Kmer from another
Kmer1 = esp1->second.query_kmer(); //object.
Kmer2 = esp2->second.query_kmer();
Species::Kmer::const_iterator it1, it2, last1, last2;
it1 = Kmer1.cbegin(); //Both Kmer are maps, therefore they are ordered and
it2 = Kmer2.cbegin(); //whitout duplicates.
last1 = --Kmer1.cend();
last2 = --Kmer2.cend();
double U, I;
U = I = 0;
l oop, где применяется формула:
while (it1 != Kmer1.cend() and it2 != Kmer2.cend()){
if (it1->first == it2->first) {
if (it1->second > it2->second) {
U += it1->second;
I += it2->second;
} else {
U += it2->second;
I += it1->second;
}
++it1;
++it2;
} else if (it1->first < it2->first) {
U += it1->second;
++it1;
} else {
U += it2->second;
++it2;
}
}
Обратите внимание, что вместо того, чтобы сначала создать объединение и пересечение, а затем выполнить общую сумму каждый, я сразу перешел к сумме значений. Я знаю, может быть, это не так сложно, но я пытался решить эту проблему, но я в значительной степени застрял ...
I've uploaded the whole code at Github: (Maybe it helps)
- There is a makefile to build the code
- There is a file called input.txt with a sample for this specific problem
- Also inside the input.txt, after line13 (fin) I've added the expected output
- Executing ./program.exe < input.txt should be enough to test it.
https://github.com/PauGalopa/Cpp-Micro-Projects/tree/master/Release
ВАЖНО Да! Я знаю почти все функции STL, которые могли бы сделать это в нескольких строках, НО ... Поскольку это проект колледжа, я привязан к ограничениям sillabus, поэтому учтите, что мне разрешено использовать только "map «строка», «вектор» и многое другое. Нет, я не могу использовать «алгоритм» (я действительно sh мог бы). Я проясню любые сомнения относительно того, что я могу делать или использовать в комментариях.