Create lists of equivalences from pairs
Clash Royale CLAN TAG#URR8PPP
up vote
5
down vote
favorite
I have a list of pairs, e.g.,
ex1=1,2,1,3,2,3, 4,5, 6,7,6,8, 7,8
that I would like to merge into the list
output=1,2,3,4,5,6,7,8
via the transitive property. More explicitly, if i,j
is a pair in the original list, then i
and j
should both be in the same list. Furthermore, if i,j
and j,k
are pairs, then i
, j
, and k
should all be in the same list. Another way to view this problem is that we begin with lists of binary equivalences and wish to construct all the equivalence classes.
In the case that the original list of pairs satisfies the property that if i,j
is listed as a pair then j,i
is also listed, e.g.,
ex2=1,2,2,1,1,3,3,1, 2,3,3,2, 4,5,5,4, 6,7,7,6,6,8,8,6,7,8,8,7
then the following function works:
equivClasses[listOfPairs_]:=listOfPairs//GatherBy[#, First]&//Map[Fold[Union], #, 1]&// Union
However, this function fails when the reverse of each pair doesn't necessarily appear, e.g., equivClasses[ex1]=1,2,3,2,3,...
. We can manufacture such a new list easily, e.g., by
newList=(Sort/@ex1)~Join~(ReverseSort/@ex1)//Union
and then calling equivClasses
as before.
Q1 Is the above function equivClasses
reasonable? It feels a bit kludgy to me, in particular insofar as the code creates $n$-copies of each sublist of length $n$ before Union
-ing them away.
Q2 The scope in which this problem has arisen is somewhat large and computationally expensive. The list of pairs that I can generate contains ~10^5 pairs of integers and takes ~10min if I only generate the pairs i,j
with i < j
. I can certainly do the Sort...~Join~ReverseSort
business, this seems a bit inefficient insofar as it doubles the memory usage (although this step does run reasonably fast, about 0.005
sec on my machine). How can I optimize this code?
Q3 Particularly problematic is the case when the list of pairs doesn't include all pairwise comparisons, e.g., 1,2,2,3
which should still get sorted into 1,2,3
. What can I do in this case?
list-manipulation performance-tuning
add a comment |Â
up vote
5
down vote
favorite
I have a list of pairs, e.g.,
ex1=1,2,1,3,2,3, 4,5, 6,7,6,8, 7,8
that I would like to merge into the list
output=1,2,3,4,5,6,7,8
via the transitive property. More explicitly, if i,j
is a pair in the original list, then i
and j
should both be in the same list. Furthermore, if i,j
and j,k
are pairs, then i
, j
, and k
should all be in the same list. Another way to view this problem is that we begin with lists of binary equivalences and wish to construct all the equivalence classes.
In the case that the original list of pairs satisfies the property that if i,j
is listed as a pair then j,i
is also listed, e.g.,
ex2=1,2,2,1,1,3,3,1, 2,3,3,2, 4,5,5,4, 6,7,7,6,6,8,8,6,7,8,8,7
then the following function works:
equivClasses[listOfPairs_]:=listOfPairs//GatherBy[#, First]&//Map[Fold[Union], #, 1]&// Union
However, this function fails when the reverse of each pair doesn't necessarily appear, e.g., equivClasses[ex1]=1,2,3,2,3,...
. We can manufacture such a new list easily, e.g., by
newList=(Sort/@ex1)~Join~(ReverseSort/@ex1)//Union
and then calling equivClasses
as before.
Q1 Is the above function equivClasses
reasonable? It feels a bit kludgy to me, in particular insofar as the code creates $n$-copies of each sublist of length $n$ before Union
-ing them away.
Q2 The scope in which this problem has arisen is somewhat large and computationally expensive. The list of pairs that I can generate contains ~10^5 pairs of integers and takes ~10min if I only generate the pairs i,j
with i < j
. I can certainly do the Sort...~Join~ReverseSort
business, this seems a bit inefficient insofar as it doubles the memory usage (although this step does run reasonably fast, about 0.005
sec on my machine). How can I optimize this code?
Q3 Particularly problematic is the case when the list of pairs doesn't include all pairwise comparisons, e.g., 1,2,2,3
which should still get sorted into 1,2,3
. What can I do in this case?
list-manipulation performance-tuning
1
closely related: Using Gather to rearrange my data, Computing the equivalence classes of the symmetric transitive closure of a relation
â kglr
27 mins ago
add a comment |Â
up vote
5
down vote
favorite
up vote
5
down vote
favorite
I have a list of pairs, e.g.,
ex1=1,2,1,3,2,3, 4,5, 6,7,6,8, 7,8
that I would like to merge into the list
output=1,2,3,4,5,6,7,8
via the transitive property. More explicitly, if i,j
is a pair in the original list, then i
and j
should both be in the same list. Furthermore, if i,j
and j,k
are pairs, then i
, j
, and k
should all be in the same list. Another way to view this problem is that we begin with lists of binary equivalences and wish to construct all the equivalence classes.
In the case that the original list of pairs satisfies the property that if i,j
is listed as a pair then j,i
is also listed, e.g.,
ex2=1,2,2,1,1,3,3,1, 2,3,3,2, 4,5,5,4, 6,7,7,6,6,8,8,6,7,8,8,7
then the following function works:
equivClasses[listOfPairs_]:=listOfPairs//GatherBy[#, First]&//Map[Fold[Union], #, 1]&// Union
However, this function fails when the reverse of each pair doesn't necessarily appear, e.g., equivClasses[ex1]=1,2,3,2,3,...
. We can manufacture such a new list easily, e.g., by
newList=(Sort/@ex1)~Join~(ReverseSort/@ex1)//Union
and then calling equivClasses
as before.
Q1 Is the above function equivClasses
reasonable? It feels a bit kludgy to me, in particular insofar as the code creates $n$-copies of each sublist of length $n$ before Union
-ing them away.
Q2 The scope in which this problem has arisen is somewhat large and computationally expensive. The list of pairs that I can generate contains ~10^5 pairs of integers and takes ~10min if I only generate the pairs i,j
with i < j
. I can certainly do the Sort...~Join~ReverseSort
business, this seems a bit inefficient insofar as it doubles the memory usage (although this step does run reasonably fast, about 0.005
sec on my machine). How can I optimize this code?
Q3 Particularly problematic is the case when the list of pairs doesn't include all pairwise comparisons, e.g., 1,2,2,3
which should still get sorted into 1,2,3
. What can I do in this case?
list-manipulation performance-tuning
I have a list of pairs, e.g.,
ex1=1,2,1,3,2,3, 4,5, 6,7,6,8, 7,8
that I would like to merge into the list
output=1,2,3,4,5,6,7,8
via the transitive property. More explicitly, if i,j
is a pair in the original list, then i
and j
should both be in the same list. Furthermore, if i,j
and j,k
are pairs, then i
, j
, and k
should all be in the same list. Another way to view this problem is that we begin with lists of binary equivalences and wish to construct all the equivalence classes.
In the case that the original list of pairs satisfies the property that if i,j
is listed as a pair then j,i
is also listed, e.g.,
ex2=1,2,2,1,1,3,3,1, 2,3,3,2, 4,5,5,4, 6,7,7,6,6,8,8,6,7,8,8,7
then the following function works:
equivClasses[listOfPairs_]:=listOfPairs//GatherBy[#, First]&//Map[Fold[Union], #, 1]&// Union
However, this function fails when the reverse of each pair doesn't necessarily appear, e.g., equivClasses[ex1]=1,2,3,2,3,...
. We can manufacture such a new list easily, e.g., by
newList=(Sort/@ex1)~Join~(ReverseSort/@ex1)//Union
and then calling equivClasses
as before.
Q1 Is the above function equivClasses
reasonable? It feels a bit kludgy to me, in particular insofar as the code creates $n$-copies of each sublist of length $n$ before Union
-ing them away.
Q2 The scope in which this problem has arisen is somewhat large and computationally expensive. The list of pairs that I can generate contains ~10^5 pairs of integers and takes ~10min if I only generate the pairs i,j
with i < j
. I can certainly do the Sort...~Join~ReverseSort
business, this seems a bit inefficient insofar as it doubles the memory usage (although this step does run reasonably fast, about 0.005
sec on my machine). How can I optimize this code?
Q3 Particularly problematic is the case when the list of pairs doesn't include all pairwise comparisons, e.g., 1,2,2,3
which should still get sorted into 1,2,3
. What can I do in this case?
list-manipulation performance-tuning
list-manipulation performance-tuning
asked 58 mins ago
erfink
289110
289110
1
closely related: Using Gather to rearrange my data, Computing the equivalence classes of the symmetric transitive closure of a relation
â kglr
27 mins ago
add a comment |Â
1
closely related: Using Gather to rearrange my data, Computing the equivalence classes of the symmetric transitive closure of a relation
â kglr
27 mins ago
1
1
closely related: Using Gather to rearrange my data, Computing the equivalence classes of the symmetric transitive closure of a relation
â kglr
27 mins ago
closely related: Using Gather to rearrange my data, Computing the equivalence classes of the symmetric transitive closure of a relation
â kglr
27 mins ago
add a comment |Â
3 Answers
3
active
oldest
votes
up vote
5
down vote
accepted
ConnectedComponents[Graph[ex1]]
would be easier.
Really a cool solution!
â mgamer
49 mins ago
@mgamer Thank you. =D
â Henrik Schumacher
37 mins ago
Hah! That's super slick. Especially since this is happening in a graph theoretic context (construction of a Fischer cover). Thank you!
â erfink
28 mins ago
You're welcome!
â Henrik Schumacher
22 mins ago
add a comment |Â
up vote
5
down vote
ConnectedComponents[ex1]
6, 7, 8, 1, 2, 3, 4, 5
1
... this more convenient form seems to be undocumented.
â kglr
21 mins ago
add a comment |Â
up vote
1
down vote
Union @@@ Gather[ex1, IntersectingQ]
1, 2, 3, 4, 5, 6, 7, 8
Seems to fail for1,2,2,3,3,4
?
â erfink
1 min ago
add a comment |Â
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
5
down vote
accepted
ConnectedComponents[Graph[ex1]]
would be easier.
Really a cool solution!
â mgamer
49 mins ago
@mgamer Thank you. =D
â Henrik Schumacher
37 mins ago
Hah! That's super slick. Especially since this is happening in a graph theoretic context (construction of a Fischer cover). Thank you!
â erfink
28 mins ago
You're welcome!
â Henrik Schumacher
22 mins ago
add a comment |Â
up vote
5
down vote
accepted
ConnectedComponents[Graph[ex1]]
would be easier.
Really a cool solution!
â mgamer
49 mins ago
@mgamer Thank you. =D
â Henrik Schumacher
37 mins ago
Hah! That's super slick. Especially since this is happening in a graph theoretic context (construction of a Fischer cover). Thank you!
â erfink
28 mins ago
You're welcome!
â Henrik Schumacher
22 mins ago
add a comment |Â
up vote
5
down vote
accepted
up vote
5
down vote
accepted
ConnectedComponents[Graph[ex1]]
would be easier.
ConnectedComponents[Graph[ex1]]
would be easier.
answered 56 mins ago
Henrik Schumacher
40.6k256121
40.6k256121
Really a cool solution!
â mgamer
49 mins ago
@mgamer Thank you. =D
â Henrik Schumacher
37 mins ago
Hah! That's super slick. Especially since this is happening in a graph theoretic context (construction of a Fischer cover). Thank you!
â erfink
28 mins ago
You're welcome!
â Henrik Schumacher
22 mins ago
add a comment |Â
Really a cool solution!
â mgamer
49 mins ago
@mgamer Thank you. =D
â Henrik Schumacher
37 mins ago
Hah! That's super slick. Especially since this is happening in a graph theoretic context (construction of a Fischer cover). Thank you!
â erfink
28 mins ago
You're welcome!
â Henrik Schumacher
22 mins ago
Really a cool solution!
â mgamer
49 mins ago
Really a cool solution!
â mgamer
49 mins ago
@mgamer Thank you. =D
â Henrik Schumacher
37 mins ago
@mgamer Thank you. =D
â Henrik Schumacher
37 mins ago
Hah! That's super slick. Especially since this is happening in a graph theoretic context (construction of a Fischer cover). Thank you!
â erfink
28 mins ago
Hah! That's super slick. Especially since this is happening in a graph theoretic context (construction of a Fischer cover). Thank you!
â erfink
28 mins ago
You're welcome!
â Henrik Schumacher
22 mins ago
You're welcome!
â Henrik Schumacher
22 mins ago
add a comment |Â
up vote
5
down vote
ConnectedComponents[ex1]
6, 7, 8, 1, 2, 3, 4, 5
1
... this more convenient form seems to be undocumented.
â kglr
21 mins ago
add a comment |Â
up vote
5
down vote
ConnectedComponents[ex1]
6, 7, 8, 1, 2, 3, 4, 5
1
... this more convenient form seems to be undocumented.
â kglr
21 mins ago
add a comment |Â
up vote
5
down vote
up vote
5
down vote
ConnectedComponents[ex1]
6, 7, 8, 1, 2, 3, 4, 5
ConnectedComponents[ex1]
6, 7, 8, 1, 2, 3, 4, 5
answered 25 mins ago
kglr
163k8188387
163k8188387
1
... this more convenient form seems to be undocumented.
â kglr
21 mins ago
add a comment |Â
1
... this more convenient form seems to be undocumented.
â kglr
21 mins ago
1
1
... this more convenient form seems to be undocumented.
â kglr
21 mins ago
... this more convenient form seems to be undocumented.
â kglr
21 mins ago
add a comment |Â
up vote
1
down vote
Union @@@ Gather[ex1, IntersectingQ]
1, 2, 3, 4, 5, 6, 7, 8
Seems to fail for1,2,2,3,3,4
?
â erfink
1 min ago
add a comment |Â
up vote
1
down vote
Union @@@ Gather[ex1, IntersectingQ]
1, 2, 3, 4, 5, 6, 7, 8
Seems to fail for1,2,2,3,3,4
?
â erfink
1 min ago
add a comment |Â
up vote
1
down vote
up vote
1
down vote
Union @@@ Gather[ex1, IntersectingQ]
1, 2, 3, 4, 5, 6, 7, 8
Union @@@ Gather[ex1, IntersectingQ]
1, 2, 3, 4, 5, 6, 7, 8
edited 5 mins ago
answered 13 mins ago
C. E.
47.8k391193
47.8k391193
Seems to fail for1,2,2,3,3,4
?
â erfink
1 min ago
add a comment |Â
Seems to fail for1,2,2,3,3,4
?
â erfink
1 min ago
Seems to fail for
1,2,2,3,3,4
?â erfink
1 min ago
Seems to fail for
1,2,2,3,3,4
?â erfink
1 min ago
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f183060%2fcreate-lists-of-equivalences-from-pairs%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
1
closely related: Using Gather to rearrange my data, Computing the equivalence classes of the symmetric transitive closure of a relation
â kglr
27 mins ago