在做一个大学项目时,我遇到了以下问题:我有两个地图(Kmer1 和 Kmer2),它们由一个字符串(键)和一个整数(值)组成。我必须计算遵循这个公式的距离
[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;
应用公式的循环:
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 功能都可以在几行中做到这一点,但是......由于这是一个大学项目,我受制于教学大纲的限制,所以请考虑我只被允许使用“地图" "string" "vector" 等等。不,我不能使用“算法”(我真的希望我可以)我会在评论中澄清关于我可以做什么或使用哪些事情的任何疑问。