[Python-de] [Python vs. C] 3n+1-Problem
Karl Pflästerer
sigurd at 12move.de
Die Feb 10 18:56:41 CET 2004
On 10 Feb 2004, Jens Kubieziel <- python at kubieziel.de wrote:
> Hierbei wird das 3n+1-Problem (teile eine Zahl solange durch zwei, wenn
> sie gerade ist oder, falls nicht, multipliziere mit drei und addiere
> eins, bis man eins erreicht.) vorausgesetzt. Wenn z.B. 3 eingegeben
> wird, entsteht die Folge: 3 10 5 16 8 4 2 1. Aufgabe ist nun, in einem
> einzugebenden Intervall die Anzahl aller Folgenglieder (im obigen Bsp.
> 8) zu errechnen und auszugeben.
> Dies habe ich zunächst mit folgendem Brute-Force-Ansatz probiert:
[...]
> for number in range(i,j+1):
Besser xrange hier.
> rounds = 1
> while number>1:
> if number % 2 == 0:
> number = number/2
> rounds = rounds+1
> else:
> number = 3*number+1
> rounds = rounds+1
> total_rounds.append(rounds)
Wieso füllst du eine Liste?
> total_rounds.sort()
Und sortierst sie noch? Noch dazu in jedem Schleifenschritt! Also
1000000 mal.
> print total_rounds[len(total_rounds)-1]
Hier suchst du auf die wohl maximal ineffizienteste Art das letzte
Listenelement.
[...]
> meinem Rechner (AMD Athlon 1 GHz) etwas über 20 Stunden. Das Äquivalent
Kein Wunder.
> in C hingegen:
Das ist kein äquivalentes Programm.
[...]
> if (cnt > max) {
> max = cnt;
> imax = i;
Hier speicherst du einfach die Anzahl der Runden und den zugehörigen
Startwert in 2 Variablen. Keine Liste, kein Sortieren ...
[...]
> benötigt für selbigen Durchlauf nur 2-3 Sekunden.
Auch dies ist kein Wunder.
> Bis auf die fehlenden Eingaberoutinen im C-Programm sind beide Programme
> IMHO äquivalent (Meine ich zumindest). Wo könnte hier das Problem
Das Python Programm ist nahezu maximal ineffizient und das C Programm
versucht sogar das letzte Quentchen über register Deklarationen
herauszuquetschen: das nennst du äquivalent?
> liegen, dass die Python-Variante derart langsamer ist?
Woran wohl?
Karl
--
Roses are red,
Violets are blue,
I'm schizophrenic...
And I am too.