Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从多个向量中找到不相同的元素?_C++_Algorithm_Vector_Set - Fatal编程技术网

C++ 如何从多个向量中找到不相同的元素?

C++ 如何从多个向量中找到不相同的元素?,c++,algorithm,vector,set,C++,Algorithm,Vector,Set,给定多个向量/集合,每个向量/集合包含多个整数,这些整数在一个向量中不同。现在我想检查,是否存在一个集合,该集合是通过从每个给定向量/集合中提取一个元素组成的,同时提取的数字彼此不相同 例如,给定集合a、b、c、d为: a <- (1,3,5); b <- (3,6,8); c <- (2,3,4); d <- (2,4,6) a您可以将问题重新表述为二部图中的匹配: 左侧的节点是您的集合 右侧的节点是集合中出现的整数 如果集合包含给定的整数,则“集合”节点和

给定多个向量/集合,每个向量/集合包含多个整数,这些整数在一个向量中不同。现在我想检查,是否存在一个集合,该集合是通过从每个给定向量/集合中提取一个元素组成的,同时提取的数字彼此不相同

例如,给定集合a、b、c、d为:

a <- (1,3,5); 
b <- (3,6,8); 
c <- (2,3,4); 
d <- (2,4,6)

a您可以将问题重新表述为二部图中的匹配:

  • 左侧的节点是您的集合
  • 右侧的节点是集合中出现的整数
如果集合包含给定的整数,则“集合”节点和“整数”节点之间有一条边。然后,您试图在这个二部图中找到一个匹配:每个集合将与一个整数相关联,没有整数将被使用两次。寻找这种匹配的简单算法的运行时间是O(| V | | E |),这里的| V |小于(m+1)k,并且| E |等于mk。所以在O(m^2 k^2)中有一个解。请参阅:

二部匹配算法:

该算法适用于有向图。开始时,所有边的方向都是从左到右。如果两个节点之间的边是从右向左的,则将匹配两个节点,因此在开始时,匹配为空。该算法的目标是找到“增强路径”(或交替路径),即增加匹配大小的路径

增广路径是有向图中从不匹配的左节点开始到不匹配的右节点结束的路径。一旦你有了一个扩展路径,你只需要沿着路径翻转所有的边,使匹配的大小增加一倍。(匹配的大小将增加,因为您还有一条不属于匹配的边。这称为交替路径,因为路径在不属于匹配的边(从左到右)和属于匹配的边(从右到左)之间交替。)

以下是如何找到扩充路径:

  • 所有节点都标记为未访问
  • 选择一个未访问且不匹配的左节点
  • 执行深度优先搜索,直到找到不匹配的右节点(然后有一个扩展路径)。如果找不到不匹配的右节点,请转到2
  • 如果找不到扩充路径,则匹配是最佳的

    查找增广路径的复杂性为O(| E |),并且您最多执行min(k,m)次,因为最佳匹配的大小由k和m限定。所以对于你的问题,复杂性是O(mk min(m,k))


    你也可以参见第1节,以获得更完整的解释和证明。

    我可以假设这些事情:1)每个集合都是排序的,2)每个集合中的元素不能超过,比如说100个,3)并且不能超过,比如说10个集合吗?谢谢纳瓦兹。是的,在一开始做这样的假设没有什么坏处。我唯一能想到的就是通过缩短战斗一代的时间来减少问题。因此,如果你有一个2,不要在下一个包含1、2和/或3的集合中尝试任何组合。如果您在集合“a”中选择了3,那么使用集合“b”中的3生成的所有组合将被删除。它不会减少O(m^k),但会减少实际运行时间。感谢Edouard,这是一个非常好的主意!但是你能告诉我可以使用什么算法吗?我知道要求具体的算法很难,但我对图论中的匹配并不熟悉。谢谢。我编辑了我的答案,添加了关于二部匹配算法的描述。