Wie Finden Sie Die Führende Null In einer Reihe mit C
beispielsweise,wenn ich habe die Nummer 64,und dann seine binäre Darstellung wäre 0000 0000 0000 0000 0000 0000 0100 0000 also führende null ist 25.
denken Sie daran, ich habe um diese zu berechnen in O(1) Zeit.
bitte sagen Sie mir den richtigen Weg, das zu tun.auch wenn Ihre Komplexität ist >O(1) bitte posten Sie Ihre Antwort. danke
- O(1) bedeutet, dass Sie variieren das problem, die Zeit zu berechnen die Lösung konstant bleibt (in etwa). Das macht keinen Sinn mit einer festen Größe problem wie deines.
- Ist dies eine Hausaufgaben-Frage? Was haben Sie bereits versucht?
- Ich bin nur jetzt zu bemerken, das [funktionale-Programmierung] tag-ist dies wirklich funktionale Programmierung oder benötigen Sie nur eine Funktion, die dies tut?
- Sie können beliebig viele 0EN vor jede Zahl in einer beliebigen Basis, ohne es zu verändern. Sind Sie auf der Annahme einer 32-bit-integer-Typ? Wenn dem so ist, dann sagen Sie es. Bitte beachten Sie, dass C ist nicht verpflichtet, einen Typ mit genau 32 bits bei allen: die Größen der
char
/short
/int
/long
angegeben sind nur als minima und relativ zu einander. - mit O(1) ist richtig hier, wenn Sie erwägen, die Größe des Problems, die Anzahl der führenden Nullen in der Binärdarstellung. Viele algorithmen dieser Komplexität abhängig von der Anzahl der führenden Nullen in der tatsächlichen Anzahl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich fand gerade dieses problem an der Spitze der Suchergebnisse, und dieser code:
wo pop zählt 1-bits ist ein Vielfaches schneller als die erste (von Ihnen positiv bewertet werden) zu beantworten.
Konnte ich nicht feststellen, die Frage war über-64-bit-zahlen, also hier:
ist eine 64-bit-Algorithmus, mehrmals wieder schneller als die oben genannten.
Rechte shift - ist dein Freund.
Sehen hier für die 32-bit-version und andere große bit-twiddling hacks.
und nach, die Sie gerade brauchen, um zurückzukehren 64 - numOnes(x).
Ein einfacher Weg, dies zu tun, ist numOnes32(x) + numOnes32(x >> 32), wo numOnes32 ist definiert als:
Ich habe nicht versucht, aus diesem code, aber das sollte numOnes64 direkt (in weniger Zeit):
Ich würde gehen mit:
Weil der Logarithmus zur Basis 2 etwa stellt die Anzahl der bits, die erforderlich ist, um eine Zahl darstellen, könnte es sinnvoll sein in die Antwort:
Natürlich ein Nachteil bei der Verwendung
log(3)
ist, dass es eine floating-point routine; es gibt wahrscheinlich einige höchst clever bit-tricks zu finden, die Anzahl der führenden null-bits in Integer-zahlen, aber ich kann mir nicht vorstellen, das man aus der Spitze von meinem Kopf...Verwendung von floating-points ist nicht die richtige Antwort....
Hier ist ein algo, den ich verwenden, um die Anzahl der TRAILING-0... ändern Sie es für Führende...
Dieser Algorithmus ist in O(1) - (wird immer ausgeführt wird ~ die gleiche Zeit oder die gleiche Zeit auf einer CPU).