Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find the nonidentical elements from multiple vectors?

Given several vectors/sets, each of which contains multiple integer numbers which are different within one vector. Now I want to check, whether there exists a set which is composed by extracting only one element from each given vectors/sets, in the same time the extracted numbers are nonidentical from each other.

For example, given sets a, b, c, d as:

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

I can find out sets like (1, 8, 4, 6) or (3, 6, 2, 4) ..... actually, I only need to find out one such set to prove the existence.

applying brutal force search, there can be maximal m^k combinations to check, where m is the size of given sets, k is the number of given sets.

Are there any cleverer ways? Thank you!

like image 939
ulyssis2 Avatar asked Feb 15 '12 17:02

ulyssis2


1 Answers

You can reformulate your problem as a matching in a bipartite graph:

  • the node of the left side are your sets,
  • the node of the right side are the integer appearing in the sets.

There is an edge between a "set" node and an "integer" node if the set contains the given integer. Then, you are trying to find a matching in this bipartite graph: each set will be associated to one integer and no integer will be used twice. The running time of a simple algorithm to find such a matching is O(|V||E|), here |V| is smaller than (m+1)k and |E| is equal to mk. So you have a solution in O(m^2 k^2). See: Matching in bipartite graphs.

Algorithm for bipartite matching:

The algorithm works on oriented graphs. At the beginning, all edges are oriented from left to right. Two nodes will be matched if the edge between them is oriented from right to left, so at the beginning, the matching is empty. The goal of the algorithm is to find "augmenting paths" (or alternating paths), i.e. paths that increase the size the matching.

An augmenting path is a path in the directed graph starting from an unmatched left node and ending at an unmatched right node. Once you have an augmenting path, you just have to flip all the edges along the path to one increment the size of the matching. (The size of the matching will be increased because you have one more edge not belonging to the matching. This is called an alternating path because the path alternate between edges not belonging to the matching, left to right, and edges belonging to the matching, right to left.)

Here is how you find an augmenting path:

  1. all the nodes are marked as unvisited,
  2. you pick an unvisited and unmatched left node,
  3. you do a depth first search until you find an unmatched right node (then you have an augmenting path). If you cannot find an unmatched right node, you go to 2.

If you cannot find an augmenting path, then the matching is optimal.

Finding an augmenting path is of complexity O(|E|), and you do this at most min(k, m) times, since the size of best matching is bounded by k and m. So for your problem, the complexity will be O(mk min(m, k)).

You can also see this reference, section 1., for a more complete explanation with proofs.

like image 172
Edouard Avatar answered Nov 14 '22 22:11

Edouard