【发布时间】:2020-08-21 09:07:12
【问题描述】:
在做大学项目时,我遇到了以下问题: 我有两个地图(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 功能都可以在几行中做到这一点,但是...... 由于这是一个大学项目,我受到教学大纲的限制,因此请考虑我只允许使用“地图”“字符串”“向量”等等。 不,我不能使用“算法”(我真希望我能) 我会在评论中澄清关于我可以做或使用哪些事情的任何疑问。
【问题讨论】:
-
当一个迭代器到达末尾而另一个没有在 while 循环中时,我认为您无法正确处理这种情况。当循环结束时,可能仍会在任一映射中留下一些元素,这些元素可以包含在
U中。 -
确实,我想过在 while 循环中评估 """it1 != last1 and it2!= last2""" ,然后解析剩余的元素,但这取决于哪个先结束
-
当前代码有什么问题?它会带来错误的结果吗?它会崩溃吗?
-
我会在发现错误时编辑循环,但现在它只会给出错误的结果
标签: c++ algorithm set-intersection set-union