在vc ++中组合两个向量的最佳方法

时间:2011-06-23 09:27:39

标签: algorithm visual-c++ vector logic

我找到了一个更好的逻辑来组合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]

请帮助我找到最佳解决方案。

2 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解您的问题...但是,您是否有机会寻找std::set_intersection

算法要求对范围进行排序。因此,对它们进行排序并将其提供给set_intersection

答案 1 :(得分:1)

在这里,我们很乐意帮助那些有提示的人做家庭作业问题,前提是他们已经预先知道这个问题作为家庭作业 - 如你所做的那样:)

就像现在一样,要查找vector_A中特定元素的匹配项,您需要扫描vector_B的每个元素。因此,如果vector_A中有m个元素,vector_B中有n个元素,则需要O(mn)时间来查找所有匹配项 - 相当慢。

假设我们对这两个向量进行排序,并相应地重新排序mark1mark2。您现在注意到的是,当在vector_B中查找特定元素时,您可以在到达过大的元素时立即停止 - 因为您知道所有后续元素必须更大。这将节省一些时间。

事实上,您可以更进一步,只查看vector_Avector_B的第一个元素。我们分别称这些ab。现在只有3例中的一例可以发生:

  1. a < b。在这种情况下,我们可以得出结论a vector_B无法在<{1}}中出现 ,因为所有后来的元素都至少与b一样大,已经是a > b太大了。
  2. b。同样,我们可以得出结论vector_A无法在a中出现 ,因为所有后来的元素都至少与a = b一样大,这已经太大了。
  3. {{1}}。在这种情况下,显然这个数字出现在两个向量中!
  4. 请记住,排序只需要O(nlog n)时间,这应该会为您提供更快的算法提示。如果您需要更多帮助理解,请发表评论。