Schrift
[thread]7495[/thread]

Operation auf alle kombination von Zeilen ?

Leser: 1


<< >> 7 Einträge, 1 Seite
Updecrator
 2005-11-24 11:41
#60396 #60396
User since
2005-11-16
17 Artikel
BenutzerIn
[default_avatar]
hallo, Zusammen!

ich möchte eine Operation über alle kombinationen von 3 Zeilen durch führen:
z.B. eine Datei enthält 6 Zeilen:
Quote
1. zeile a ...
2. zeile b ...
3. zeile c ...
4. zeile d ...
5. zeile e ...
6. zeile f  ...

eine Operation z.B. 'op' soll auf alle '3-er' durchgeführt werden:
op(1, 2, 3), op(1, 3, 4), op(1, 4, 5), op(2, 3, 4), op(3, 4, 5) ...
op(1, 2, 4), op(1, 3, 5), op(1, 4, 6),  ...
op(1, 2, 5), op(1, 3, 6),  ...
op(1, 2, 6),  ...
usw.
es gibt also insgesamt (Fakultät 3 von 6) Kombinationen.

Könntet ihr mir helfen,
diese Iteration auszuführen.
vielen Dank im Voraus!
pKai
 2005-11-24 11:55
#60397 #60397
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Auf dem CPAN müsstest du eigentlich dazu fündig werden.
I sense a soul in search of answers.
renee
 2005-11-24 12:00
#60398 #60398
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du solltest Dir mal CPAN:Math::Combinatorics, CPAN:Algorithm::Combinatorics oder ein anderes CPAN:Permute-Modul anschauen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2005-11-24 14:39
#60399 #60399
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Oder du schreibst dir selbst eine Funktion, die Teilmengen erzeugt. Denn hier geht es wohl weniger um Permutationen als um Teilmengen mit k Elementen aus einer n-Elementigen Menge zu bestimmen. Aber auch dazu gibt es garantiert fertiges auf dem CPAn, allerdings wäre mir dafür die Suche danach zu aufwändig *duck*.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2005-11-24 15:49
#60400 #60400
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
es gab doch mal ein RdW, bei dem es aufgabe war alle teilmengen einer menge zu generieren. meine lösung war glaub ich:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
sub funcP {
return [], rec(@_);
}

sub rec {
return () unless @_;
map {
my $first = shift;
[$first], map { [ $first, @$_ ] } rec(@_)
} @_;
}


da müsste man dann nur noch die ergebnisse rausfiltern, die die gewünschte länge haben
Code: (dl )
my @result = grep{ @$_ == 3 } funcP( @menge );


is natürlich nicht performant, aber sollte funktionieren.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
pKai
 2005-11-24 18:37
#60401 #60401
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Ah, gut erkannt Crian, da hab ich wohl etwas flüchtig drübergelesen.
Es geht also nur bedingt um Permutationen, eher um Binomialkoeffizienten.
Aus der kombinatorischen Deutung derselben leite ich dann folgende Funktion ab, die mir die k-Teilmengen einer N-Menge (n unterschiedliche Objekte!) als Array-of-Array zurückliefert:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
use warnings;
use Data::Dumper;

print Dumper(kTeilmengen([1..6], 3));

sub kTeilmengen {
my ($Menge, $k) = @_;
my $n = @$Menge;
return [$Menge] if $n <= $k; # eigentlich $n == $k
return [[]] if $k <= 0; # eigentlich $k == 0
my $e = shift @$Menge;
[
(map { [$e, @$_] } @{kTeilmengen([@$Menge], $k-1)}),
@{kTeilmengen([@$Menge], $k)}
];
}
I sense a soul in search of answers.
sesth
 2005-11-24 19:58
#60402 #60402
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
[quote=Crian,24.11.2005, 13:39]Denn hier geht es wohl weniger um Permutationen als um Teilmengen mit k Elementen aus einer n-Elementigen Menge zu bestimmen.[/quote]
Ich denke, das stimmt schon so. Falls aber die Aufgabenstellung nicht exakt ist und op(1,2,3) != op (2,1,3) dann handelt es sich um Permutationen.
Gruß
Thomas
<< >> 7 Einträge, 1 Seite



View all threads created 2005-11-24 11:41.