SQL結合を使用すると、必要な処理を実行できるはずです。サンプルSQLiteコード:
.headers on
.separator "\t"
create temporary table 'buyers' (
buyer integer primary key,
wants char(1)
);
insert into buyers(wants) values('a');
insert into buyers(wants) values('b');
insert into buyers(wants) values('c');
insert into buyers(wants) values('d');
insert into buyers(wants) values('e');
create temporary table 'sellers' (
seller integer primary key,
offers char(1)
);
insert into sellers(offers) values ('a');
insert into sellers(offers) values ('b');
insert into sellers(offers) values ('b');
insert into sellers(offers) values ('e');
select
buyers.buyer as buyer,
sellers.seller as seller,
buyers.wants as good
from
buyers left outer join sellers
on
buyers.wants = sellers.offers
;
出力:
買い手売り手良い
1 1 a
2 2 b
2 3 b
3 c
4日
5 4 e
Perlで同様のことをする:
#!/usr/bin/env perl
use strict;
use warnings;
use Graph::Undirected;
my $g = Graph::Undirected->new(unionfind => 1);
# buyers
$g->add_edge(b1 => 'a');
$g->add_edge(b2 => 'b');
$g->add_edge(b3 => 'c');
$g->add_edge(b4 => 'd');
$g->add_edge(b5 => 'e');
# sellers
$g->add_edge(s1 => 'a');
$g->add_edge(s2 => 'b');
$g->add_edge(s3 => 'b');
$g->add_edge(s4 => 'e');
use YAML;
print Dump [ $g->connected_components ];
出力:
-
-a
-b1
-s1
-
-s2
-b
-s3
-b2
-
-b4
-d
-
-e
-b5
-s4
-
-b3
-c