Potenzmengen berechnen mit List::PowerSet

Veröffentlicht von Thomas Fahle am (Permalink)

Potenzmengen (engl. Powerset) lassen sich mit dem CPAN-Modul List::PowerSet von Nik Clayton einfach berechnen.

 

powerset() und powerset_lazy()

List::PowerSet stellt zwei Funktionen, powerset() und powerset_lazy(), bereit.

powerset()

powerset() nimmt eine Liste (Menge) entgegen und gibt eine Referenz auf eine Liste von Referenzen auf Arrays zurück - jede Array Referenz enthält eine Teilmenge.

Beispiel:

#!/usr/bin/perl 
use strict;
use warnings;

use List::PowerSet qw/powerset/;

my @input_list = qw/ x y z /;

my $powerset = powerset(@input_list);

foreach my $ps (@$powerset) {
    print "[ @$ps ]\n";
}

Das Programm erzeugt folgende Ausgabe:

[ x y z ]
[ y z ]
[ x z ]
[ z ]
[ x y ]
[ y ]
[ x ]
[  ]

powerset_lazy()

powerset_lazy() nimmt, wie powerset(), eine Liste entgegen und liefert eine Referenz auf eine Subroutine zurück, die als Iterator verwendet werden kann. Bei jedem Aufruf des Iterators wird eine weitere Teilmenge als Referenz auf einen Array zurückgegeben.

powerset_lazy() bietet sich vor allem bei umfangreichen Listen an. Im Gegensatz zu powerset() werden nicht alle Teilmengen auf ein Mal berechnet, sondern lazy evaluiert.

Beispiel:

#!/usr/bin/perl 
use strict;
use warnings;

use List::PowerSet qw/powerset_lazy/;

my @input_list = qw/ x y z /;

my $ps_iterator = powerset_lazy( @input_list );

while ( my $set = $ps_iterator->() ) {

    # $set is the next powerset entry
    print "[ @$set ]\n";
}

Das Programm erzeugt folgende Ausgabe:

[ x y z ]
[ y z ]
[ x z ]
[ z ]
[ x y ]
[ y ]
[ x ]
[  ]

 

Siehe auch

 

Weitere Posts