我找到了一个更好的逻辑来组合2个向量。
vector_A[id][mark1];
vector_B[id][mark2];
vector_A: id = [300 , 502, 401 , 900 , 800 ,700 , 250 , 001]
mark1 = [55 , 50 , 30 , 28 , 25 , 11 , 04 , 03]
vector_B: id = [800 , 005 , 502 , 925 ,025 ,300 , 52]
mark2 = [75, 60 , 50 ,35 , 30 , 25 , 04]
组合规则是如果在两个向量中找到相同的id,则添加mark1和mark2。如果不只是显示。
vector_combined: id = [800 , 300 , 502 , 005 , 925 , 401]
mark_combine = [100, 80 , 100 , 60 , 35 ,30]
请帮助我找到最佳解决方案。
答案 0 :(得分:1)
我不确定我是否正确理解您的问题...但是,您是否有机会寻找std::set_intersection?
算法要求对范围进行排序。因此,对它们进行排序并将其提供给set_intersection
答案 1 :(得分:1)
在这里,我们很乐意帮助那些有提示的人做家庭作业问题,前提是他们已经预先知道这个问题作为家庭作业 - 如你所做的那样:)
就像现在一样,要查找vector_A
中特定元素的匹配项,您需要扫描vector_B
的每个元素。因此,如果vector_A
中有m个元素,vector_B
中有n个元素,则需要O(mn)时间来查找所有匹配项 - 相当慢。
假设我们对这两个向量进行排序,并相应地重新排序mark1
和mark2
。您现在注意到的是,当在vector_B
中查找特定元素时,您可以在到达过大的元素时立即停止 - 因为您知道所有后续元素必须更大。这将节省一些时间。
事实上,您可以更进一步,只查看vector_A
和vector_B
的第一个元素。我们分别称这些a
和b
。现在只有3例中的一例可以发生:
a < b
。在这种情况下,我们可以得出结论a
vector_B
无法在<{1}}中出现 ,因为所有后来的元素都至少与b
一样大,已经是a > b
太大了。b
。同样,我们可以得出结论vector_A
无法在a
中出现 ,因为所有后来的元素都至少与a = b
一样大,这已经太大了。 请记住,排序只需要O(nlog n)时间,这应该会为您提供更快的算法提示。如果您需要更多帮助理解,请发表评论。