Die Leute spielen ein bisschen schnell und locker mit Big-O-Notation. Im Fall von GCD tun sie dies im Allgemeinen auf zwei Arten:
1) Sie haben Recht, algorithmische Komplexität und daher große O-Notation, sollte in Bezug auf die Größe in Bits des Eingangs angegeben werden , nicht in Bezug auf die Werte der Eingabe. So sind P, NP und so weiter definiert. Unter der Annahme einer binären Eingabe und beliebig großen Zahlen (wie eine BigNum-Darstellung) und N der Anzahl der Bits der Eingabe benötigt Ihr GCD höchstens 2^N Subtraktionen, von denen jeder Zeit O (N) benötigt, um über jede Ziffer des zu laufen Zahlen werden subtrahiert. Also ist es O (N * 2^N). GCD kann natürlich viel schneller durchgeführt werden, wenn Sie Division statt Subtraktion verwenden: O (N^2).
Also, wenn wir das testing primality was proved in 2002 to be done in polynomial time sagen, das ist die technische Definition der Komplexität, und wir bedeuten Polynom in der Anzahl der Ziffern (was der schwierige Teil ist), nicht Polynom in der Eingangsnummer selbst (was trivial ist einfach zu tun in "sub-linearer Zeit" mit Trial Division.
Aber in der Praxis ist es für Algorithmen, die eine feste Anzahl ganzzahliger Eingaben benötigen, bequemer, über Komplexität zu sprechen, als wäre N die Eingabe selbst, nicht die Größe der Eingabe. Es ist nicht schädlich, solange Sie klar sind, was Sie in mehrdeutigen Fällen meinen.
2) In der Praxis sind Integer-Eingaben oft feste Größe, 32 Bit oder was auch immer, und Operationen auf ihnen wie Addition, Multiplikation und Division sind O (1) Zeit. Wir verwenden diese Fakten selektiv in unserer Bestellanalyse. Wenn Ihr GCD-Programm nur Eingänge bis zu (2^32-1) akzeptiert, dann ist es technisch O (1). Es hat eine feste Obergrenze für die Laufzeit. Ende der Analyse.
Obwohl technisch korrekt, das ist keine sehr nützliche Analyse. Fast alles, was Sie auf einem echten Computer tun, ist O (1) auf der gleichen Basis, dass die Größe des Problems durch die Hardware eingeschränkt ist.
Es ist normalerweise bequemer zu akzeptieren, dass die Addition O (1) ist, da die Zahlen feste Größe sind, aber ignorieren, dass GCD auch O (1) ist, so tun sein Verhalten im Bereich [1, 2^32) erstreckt sich bis ins Unendliche und analysiert es auf dieser Grundlage. Dann, wenn N das Maximum der zwei Eingaben ist, kommt es zu O (N): O (N) Subtraktionen, wobei jede eine konstante Zeit benötigt.
Noch einmal, das ist nicht mehrdeutig, wenn Sie wissen, was die Terms of Reference sind, aber hüte dich davor, die erste Analyse von Euklid Algorithmus mit Division, O (N^2), gegen diese Analyse des Algorithmus mit falsch zu vergleichen Subtraktion, O (N). N ist nicht gleich in jedem, und die Subtraktion ist nicht schneller ;-)
Bitte lesen Sie die vorhandenen SO Fragen + Antworten zu diesem Thema. –
Ihr Code, BTW, findet den ** größten ** gemeinsamen Teiler (gcd), auch bekannt als der höchste gemeinsame Faktor (hcf). Der "kleinste gemeinsame Nenner" einer Menge von Brüchen ist das kleinste gemeinsame ** Vielfache ** der Nenner, was etwas anderes ist. [Für zwei ganze Zahlen x und y haben wir lcm (x, y) = xy/gcd (x, y).) – ShreevatsaR
ShreevatsaR, danke, ich habe es geändert. Englisch ist nicht meine Muttersprache, also war ich mir nicht sicher, wie es heißt. –