Konvertieren von string zu Zahl & vice versa Komplexität
Was wäre die Komplexität der Konvertierung von string in Ihre entsprechende Nummer, oder Umgekehrt? Ändert es je nach Programmiersprache?
Auf dem Gesicht, braucht man zum durchqueren die gesamte Zeichenfolge zu konvertieren, um eine Zahl, so ist es O(n), oder ist ein typecasting verwendet?
Dieser Zweifel entstand, als ich war das schreiben eine routine um zu überprüfen, ob eine gegebene Zahl ein Palindrom ist oder nicht. Ein Ansatz wäre, zu halten, teilen der Zahl durch die Basis (hier 10), häufen sich stellen, und legte Sie zusammen am Ende. Beispiel: 309/10=rem(9), 30/10=rem(0), 3/10=rem(3). wir bekommen 903.
Anderen Ansatz, den ich nahm war, wandelt diese Zahl in einen string, und da die Saiten haben eine Menge von member-Funktionen split, reverse usw., war der code viel kürzer und sauberer, aber ist das der beste Weg, dies zu tun?
- Was sehen Sie als "N" in deinem Fall?
- es gibt keine Obergrenze für die Größe von N...
- OK, ich Frage anders: Bin ich zu Recht davon ausgehen, dass Sie sehen, N als Länge der Eingabe-string ein und fragt nach der algorithmischen Komplexität der Analyse, die Zeichenfolge in eine Zahl?
- ja ttoni, du hast Recht...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Numerische strings sind formatierte zahlen im Stellenwertsystem - so der Wert der einzelnen Ziffer multipliziert mit einem Strom von der Basis muss berücksichtigt werden, um die Umwandlung der Zahl in einen Binär-format.
Also ja, es ist eine O(N) operation, da die Laufzeit steigt Linear, da mehr Ziffern Hinzugefügt werden. Doch in der Praxis N kann begrenzt werden, indem beliebige numerische Daten-Typen der Sprache unterstützt (z.B. int32_t, int64_t). Aber wenn beliebiger Genauigkeit Anzahl Arten verwendet werden, (welche in einigen Sprachen, wie Python, verwenden Sie standardmäßig), dann gibt es keine Begrenzung für die Anzahl der Ziffern (anderen als der verfügbare Speicher natürlich).
Konvertieren in eine Zahl, die Sie immer Lesen Sie alle Ziffern. So ist es zumindest
O(n)
.Nun etwas wie (pseudocode)
Ist
O(n)
. So ist die KomplexitätO(n)
O(n)
notationn
müssen neigen bis unendlich.Wenn Sie konvertieren eine Zahl N in einen string. Es dauert O(log(N)) mit der Basis 10. (Wenn Sie durch 10 dividiert und halten den Rest)
Wenn Sie konvertieren eine Zeichenfolge mit der Länge N, dann dauert es O(N). (Wenn Sie den Algorithmus verwenden whic hält hinzufügen, um Ihr die Zahl 10^(N)*Ziffer(N))
Wenn Sie Funktionen verwenden, die nicht deine (sagen wir mal für string), können Sie nur erwarten, dass Sie langsamer sein.
Ich bin mir relativ sicher, dass der Umgang mit reinen numerischen Operatoren (in c++ und c# ich denke, es wäre das "%" modulo-operator) wird zu mehr Effizienz, wenn richtig codiert, weil auf einer bestimmten Ebene, die Sie haben zu prüfen, die für ähnliche Funktionen (ist das Ende entspricht dem Anfang) und durchführen einer Umwandlung zwischen string und Zahl kann nur hinzufügen, um die Komplexität von der operation, wenn Sie dasselbe tun können, ohne, dass die Durchführung der Konvertierung.
Sagte, ich würde nicht sorgen über die Auswirkungen auf die Leistung der Umwandlung zwischen zahlen und strings, da ist es wahrscheinlich unbedeutend im Vergleich zu den Auswirkungen auf die Leistung der meisten anderen Gebiete des Programms. Numerische Datentypen sind begrenzt auf 64 bits, wodurch sich eine relativ niedrige Obergrenze für die Anzahl der Ziffern, die Sie planen können, um zu analysieren, sowieso, es sei denn, Sie sind der Umsetzung/Verwendung von custom-coded große-Zahl-Typen.
Brauchen Sie sich keine sorgen über die Komplexität als O(n) wobei n die Größenordnung der Zahl. Es wäre mehr wie O(n), wobei n die Anzahl der Ziffern (die hat den low-cap, die ich erwähnt) oder (wie bereits erwähnt in einer anderen Antwort) O(log(n)) wenn n die Größenordnung der Zahl. Relativ unbedeutende Auswirkungen auf die Leistung.
Nun, wenn, wie Sie vorschlagen, Sie haben keine Begrenzung auf N (was nicht möglich ist, weil mit 2 GB RAM kannst du nur das speichern von Rufnummern mit bis zu 2 Milliarden stellen), dann haben wir vielleicht denken, dass mehr über die Leistung der darstellenden mathematischen Operatoren. Betrachten Sie die Leistung von "%" und " /" - operator auf diese große Anzahl geben. Aber dann erkennen, dass, um die Umwandlung der Zahl in einen string, es ist im Grunde mit denselben Betreiber sowieso. Wieder einmal, kann man nicht schlagen der Handhabung, da direkt eine Nummer wenn du es richtig machst.
C# und C/C++ keine speziellen Informationen in die Saiten, das ist die (mögliche) numerischen Wert. Daher müssen Sie analysiert die Zeichenfolge Ziffer für Ziffer bei der Konvertierung.
Jedoch die Anzahl der stellen begrenzt ist, so haben wir nur O(1): die Umstellung Zeit ist begrenzt (in der Regel durch die Umwandlung von der größten Zahl). Für eine 32-bit-int die Umwandlung hat zu berücksichtigen, maximal 10 Dezimalstellen haben (und eventuell ein Schild).
Konvertierung von string ist eigentlich O(1), als auch, weil während der Analyse, es ist genug, nur auf einer begrenzten Anzahl von Zeichen (10+1 bei 32-bit int).
Streng genommen, können wir nicht
O
-notation für den Fall von int-zu-string-Konvertierung, da der maximale Wert von int ist begrenzt. Trotzdem, die benötigte Zeit für die Konvertierung (in beide Richtungen) ist beschränkt durch eine Konstante.Wie @Charles schon sagt, andere Sprachen (Python -) tatsächlich können beliebige Genauigkeit zahlen. Für die Analyse solcher zahlen, die Zeit ist
O(number of digits)
, dieO(string length)
undO(log(number))
für beide Umwandlungen, beziehungsweise. Mit beliebig genauer zahlen, man kann es nicht schneller, da für beide Konvertierungen jede Ziffer berücksichtigt werden müssen. Für die Umwandlungen zu/von einer begrenzten Genauigkeit zahlen, die gleichenO(1)
Argumentation gilt. Allerdings habe ich nicht Profil das parsing in Python selbst, also vielleicht einen weniger effizienten Algorithmus, der es verwendet wird.EDIT: nach dem @Steve Vorschlag, ich habe das parsing in C/C++ und C# überspringt die ersten whitespace-Zeichen, also die Zeit, die für string->int Konvertierung ist eigentlich
O(input length)
. Im Falle es ist bekannt, dass sich der string getrimmt ist, wird die Umwandlung wiederO(1)
.O(string size)
. Praktisch, es ist ein schöner Anwendungsfall des getrimmten strings 🙂