Schrift
[thread]7585[/thread]

Sort VS Schwartz'sche sort ??? - Benchmark (Seite 2)

Leser: 2


<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
esskar
 2006-01-03 20:41
#61459 #61459
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
such mal nach Guttman-Rosler
steffenw
 2006-01-03 23:30
#61460 #61460
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wahnsinn, was ich da alles gefunden habe:
http://www.sysarch.com/Perl/sort_paper.html (wie Sortieren)
http://cpan.uwinnipeg.ca/htdocs/Sort-Maker/Sort/Maker.pm.html (das Modul für alle Verfahren (hier mit Quelltext))
http://stemsystems.com/sort/slides/slides/index.html (wie's funktioniert)
$SIG{USER} = sub {love 'Perl' or die};
esskar
 2006-01-03 23:32
#61461 #61461
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ja, ja, das internet!
bloonix
 2006-01-04 00:07
#61462 #61462
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hi Updecrator,

[quote=Updecrator,03.01.2006, 10:05]Eigentlich sollte Schwartz'sche Sort viel schneller als die normale Sortierung,[/quote]

wenn du die Schwarzsche Transformation sinnvoll verwendest, dann ist
sie das auch. Zum Beispiel lassen sich tabellenähnliche Zeilen damit
wunderbar sortieren ...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl -w
use strict;

my @lines = ('Aschau 07426 KDNR23849',
             'Bobitz 23996 KDNR90123',
             'Coburg 96450 KDNR73369',
             'Dachau 85221 KDNR42563',
             'Erding 85435 KDNR73473',
             'Filsen 56341 KDNR84569',
             'Grimma 04668 KDNR24784',
             'Hobeck 39279 KDNR84747',
             'Inning 84416 KDNR57729',
             'Jeggau 39649 KDNR24729' );

my $spalte = 1; # die Spalte, nach der sortiert werden soll

@lines = map  { $_->[0] }
         sort { $a->[1] cmp $b->[1] }
         map  { [ $_, (split / /)[$spalte] ] } @lines;

print "$_\n" for @lines;


... weiteres Beispiel ... falls du ne Linuxbüchse hast :)

Code: (dl )
1
2
3
4
5
6
7
my $spalte = 2;

my @sproc = map  { $_->[0] }
            sort { $a->[1] <=> $b->[1] }
            map  { [ $_, (split /\s+/)[$spalte] ] } qx{ps -aux};

print for @sproc;


Greez,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
steffenw
 2006-01-04 00:53
#61463 #61463
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Was ich heute hier gelernt habe ist, daß die Guttman-Rosler-Variante auf den Perl-Callback beim sort vollständig verzichtet und damit im sort-Teil nur noch das nackte sort steht und somit auch nur reiner C-Code ausgeführt wird. :) Die Intelligenz ist somit auf die Vor- und Nachbereitungsphase verschoben, was bei der Schwarzschen nicht ist. :( Da ist der sort-Teil nur rmittelmäßig schnell.

map gibt es in 2 Varianten:
@a2 = map "irgendwas $_", @a1;
oder
@a2 = map {"irgendwas $_"} @a1;
Durch den {} Block wird jedes Mal der Garbage-Collector angeworfen, was bei der ersten nicht ist.\n\n

<!--EDIT|steffenw|1136329167-->
$SIG{USER} = sub {love 'Perl' or die};
ptk
 2006-01-04 01:37
#61464 #61464
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=steffenw,03.01.2006, 18:36]Ich weiß nicht warum, aber ich sortiere in der Schwarzschen immer den Index 0 ($a->[0]) und nicht den Index 1 ($a->[1]). Ich weiß nicht, wie das in Perl genau ist, aber ich kenne Programmierspachen in denen Index 0 immer schneller war als die anderen Indizes (weil, Adresse des Arrays ist gleich der Adresse des Elements mit Index 0). Eigentlich ist es ja der Schwarschen egal, was nun Index 0 oder 1 ist.[/quote]
Ich mache es genauso, aber das wird wohl eher Aberglaube sein :-)
ptk
 2006-01-04 01:48
#61465 #61465
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=steffenw,03.01.2006, 23:53]
map gibt es in 2 Varianten:
@a2 = map "irgendwas $_", @a1;
oder
@a2 = map {"irgendwas $_"} @a1;
Durch den {} Block wird jedes Mal der Garbage-Collector angeworfen, was bei der ersten nicht ist.[/quote]
Du meinst wohl: bei der {...}-Notation wird mit Scopes gearbeitet, wobei durch das Reference-Counting Variablen zerstört werden können (eine klassische GC hat Perl5 ja nicht).

Und tatsächlich:
Code (perl): (dl )
1
2
3
4
5
6
7
use strict;
use Benchmark qw(cmpthese);

my @a1 = (1..100);
cmpthese(-3, {"string" => sub { my @a2 = map "irgendwas $_", @a1 },
          "code"   => sub { my @a2 = map { "irgendwas $_" } @a1; },
         });


Hiermit bekomme ich mit der "code"-Variante 1% langsamere Ergebnisse. Naja, damit kann ich leben, ich finde die {...}-Variante einfach schöner zu lesen.
Updecrator
 2006-01-04 06:07
#61466 #61466
User since
2005-11-16
17 Artikel
BenutzerIn
[default_avatar]
Hallo, zusammen,

vielen Dank fuer die Infos!
so lernt man, :)

Ueber die Sortierung mit Index [0] oder [1],
habe ich immer [1] gewaehlt, und es gibt doch einen kleinen Unterschied bei der Laufzeit (10000 rand.s, 100 iterations):

Quote
10000 numbers created !
Benchmark: timing 100 iterations of Schwartz sort mit Index [1] ...
Schwartz sort mit Index [1] : 15 wallclock secs (13.09 usr + 0.14 sys = 13.23 CPU) @ 7.56/s (n=100)
Benchmark: timing 100 iterations of Schwartz sort mit Index [0] ...
Schwartz sort mit Index [0] : 15 wallclock secs (14.03 usr + 0.12 sys = 14.15 CPU) @ 7.07/s (n=100)
Rate Schwartz sort mit Index [0] Schwartz sort mit Index [1]
Schwartz sort mit Index [0] 7.07/s -- -7%
Schwartz sort mit Index [1] 7.64/s 8% --


Viel Gruss
steffenw
 2006-01-04 10:27
#61467 #61467
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Arrayzugriff ist normalerweise:
integer = array[index]
integer = Inhalt(Speicheradresse(array) + Strukturlänge_hier(Integer) * index)

nur bei Index 0 kann optimiert werden:
integer = Inhalt(Speciheradresse(array))

Ich habe vor gut 20 Jahren, wo man noch wenig Speicher hatte, optimieren müssen, damit das Projekt überhaupt realisierbar war. Und da hat man einfach reassembliert und sich angeschaut, was letztendlich beim Compilieren herauskommt und so optimiert. Es ist interessant und zum Teil auch heute noch aktuell, weil sich die Algorithmen teilweise nicht geändert haben. Dabei sah man jedoch, daß Arrayzugriffe viel Code produzieren, weil sie eben ausmultipliziert werden müssen. Das Arbeiten mit mehrdimensionalen Arrays ist dann völliger Wahnsinn. Zum Glück ist letztes in Perl gar nicht erst implementiert worden. Zeiger waren damals die Lösung, heute sind es elegante Referenzen. Somit ist heute for (i = 0; $i < ...; ...) immer noch zweite Wahl, wenn man for (@array) nehmen kann.
$SIG{USER} = sub {love 'Perl' or die};
steffenw
 2006-01-04 10:36
#61468 #61468
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=ptk,04.01.2006, 00:48]Hiermit bekomme ich mit der "code"-Variante 1% langsamere Ergebnisse. Naja, damit kann ich leben, ich finde die {...}-Variante einfach schöner zu lesen.[/quote]
Ich nehme beide Varianten, weil ich festgestellt habe, daß Perl die 2 Varianten nicht nur zum Auswählen anbietet, sondern jede ihnen Sinn hat. In dem Beispiel, @ptk, ist die Variante ohne {} einfacher lesbar, Zeichenmüll entfällt einfach. Aber wenn es mehr wird, bleibt sowieso meist nichts anderes übrig, als {} zu nehmen, sonst muß man Kopfstände machen, die dann die Lesbarkeit nicht erhöhen, sondern eher das Gegenteil bewirken.
$SIG{USER} = sub {love 'Perl' or die};
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2006-01-03 11:05.