Thread "faires" Mischen: Algorithmus gesucht
(4 answers)
Opened by Raubtier at 2014-04-04 01:40
Hallo,
ich bin gerade auf der Suche nach einem Algorithmus, der mir ein Array möglichst gleichmäßig mischt bzw. sortiert derart, dass gleiche Elemente untereinander möglichst weit voneinander entfernt sind. Beispiel mit 2 unterschiedlichen Elemente, die je 3x vorkommen: aus qw(a a a b b b) soll qw(a b a b a b) oder (gleichwertig gut) qw(b a b a b a) werden. Interessant wird es, wenn man mehrere Unterschiedliche Elemente hat... Ich habe bislang folgenden Code: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 use strict; use warnings; use feature qw(say); sub fairShuffle { my %count; ++$count{$_} for @_; my @result; for my $key (sort { $count{$a} <=> $count{$b} } keys %count) { my $newLength = @result + $count{$key}; for (1..$count{$key}) { splice @result, (($_-1) * $newLength / $count{$key}), 0, $key; } } return @result; } my @result = fairShuffle(('a') x 5, ('b') x 3, ('c') x 10, ('d') x 1, ('e') x 1); say "@result"; Das Script erzeugt die Ausgabe Code: (dl
)
c a c b c a c b c a c d c a c b c a c e Wie man sieht, sind die "b"s nicht besonders gut verteilt, dafür sind aber die "c"s perfekt verteilt (das kommt ja durch meine Sortierung oben, die diejenigen Elemente, die am öftesten vorkommen, am Ende verteilt). Andererseits: geht es besser? Gibt es einen einfacheren Algorithmus? Oder einen effizienteren? Und was ist eine sinnvolle Metrik, um zu bestimmen, ob hier ein Ergebnis gut ist? Das Ergebnis reicht mir für meinen Einsatzzweck schon aus, aber vielleicht hat hier ja jemand eine bessere Idee. |