Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
@xme11: Ad 1.: Man könnte eine Schleife über die Elemente schreiben und bei jedem Element prüfen ob es eine Quadratzahl ist und falls ja, Zähler und Summe aktualisieren.
Ad 2.: Listen haben eine `sort()`-Methode die den Timsort-Algorithmus verwendet. Kein Grund so etwas wie Mergesort oder Bubblesort selber in Python zu programmieren. Falls man eine neue, sortierte Liste erstellen möchte, gibt es die `sorted()`-Funktion.
Ad 3.: Man könnte die vorhandenen Zahlen zählen, also nicht die gesamtanzahl, sondern wie oft jede vorkommt die vorkommt, und dann schauen welche davon mehr als einmal gezählt wurde. `collections.Counter` kann dabei sehr nützlich sein. Was „Bzgl der Laufzeit“ in der Frage soll, habe ich nicht verstanden.
beertonic hat geschrieben:
2. Du kannst die Standardfunktion sorted() verwenden, die ist aber ziemlich langsam.
Worauf stützt sich diese Aussage? Ich würde sagen, dass ein selbst in Python implementierter Standard-Algorithmus vermutlich wesentlich ineffizienter sein wird, als der in Python verwendete Timsort.
Zuletzt geändert von nezzcarth am Dienstag 9. Mai 2017, 17:58, insgesamt 1-mal geändert.
@beertonic: `sorted()` ist langsam? Auf jeden Fall dürften Merge- oder Bubblesort in Python implementiert, zumindest in CPython langsamer sein. Sehr wahrscheinlich *deutlich* langsamer.
Ziemlich langsam ist vielleicht übertrieben, aber wenn die Liste lang genug ist werden die Laufzeitunterschiede deutlich. sorted() erstellt eine neue Liste was Zeit kostet.
.sort() manipuliert die vorhandene Liste deswegen ist es schneller.
edit: timsort ist bestcase O(n) das wusste ich nicht
Zuletzt geändert von beertonic am Dienstag 9. Mai 2017, 18:40, insgesamt 1-mal geändert.
@beertonic: es ist ziemlich witzlos, eine bereits sortierte Liste nocheinmal zu sortieren. Da bleibt natürlich nur die Zeit des Kopierens der Liste bei sorted und fast nichts bei sort übrig.
Edit: da Sortieren mit O(n*log(n)) geht und kopieren mit O(n), sinkt der Unterschied von sort zu sorted mit steigendem n wie 1/log(n). Ob man bei n=100000 den deutlichen Unterschied von (experimentell ermittelten) 4% noch merkt, sei dem geneigten Leser überlassen.
@nezzcarth: anhand Deiner Standardabweichung merkst Du ja, dass die Unterscheide nicht signifikant sind. Statt die Zeit für jeweils einen Sortiervorgang zu nehmen, nimmt man die Zeit für viele, wiederholt das entsprechend oft und hat dann eine relativ genau Zeitmessung. Davon zieht man dann noch die Zeit des NoP-Vorgangs ab.