2014-11-30 12 views
5

Ich versuche, eine Lösung für das Problem, das bei zwei Zahlen, finden Sie, wenn sie die fortlaufenden Nummern in der Gray-Code-Sequenz, dh wenn sie sind Gray-Code-Nachbarn vorausgesetzt, dass die Gray-Code-Sequenz nicht erwähnt wird.Wie zu finden, wenn zwei Zahlen fortlaufende Nummern in Gray-Code-Sequenz sind

Ich suchte in verschiedenen Foren, konnte aber nicht die richtige Antwort bekommen. Es wäre großartig, wenn Sie dafür eine Lösung bereitstellen könnten.

Mein Versuch, das Problem - Konvertieren Sie zwei Ganzzahlen in Binär und fügen Sie die Ziffern in beiden Zahlen getrennt hinzu und finden Sie den Unterschied zwischen der Summe der Ziffern in zwei Zahlen. Wenn der Unterschied eins ist, dann sind sie Gray-Code-Nachbarn.

Aber ich fühle, dass dies nicht für alle Fälle funktioniert. Jede Hilfe wird sehr geschätzt. Vielen Dank im Voraus!!!

+2

a und b sind Gray-Code-Nachbarn, wenn sie sich nur in einem Bit unterscheiden, d.h. wenn ein XOR b eine Potenz von 2 ist. –

+1

Beachten Sie, dass hier viele Gray-Code-Sequenzen stehen. Haben Sie eine bestimmte Reihenfolge vor Augen, oder wollen Sie wissen, ob zwei Zahlen Nachbarn in einer bestimmten Gray-Code-Sequenz sein könnten? – ErikR

+0

Vielen Dank für Ihre Antworten. Ist es möglich zu wissen, ob die gegebenen zwei Zahlen in einer Sequenz Gray-Code-Nachbarn sind? Die Reihenfolge wurde in der Frage nicht angegeben. Ich bin in einem der Interviews aufgetaucht. Jede Hilfe wird geschätzt !!! – user3923643

Antwort

-7

Ich musste diese Frage in einem Interview auch lösen. Eine der Bedingungen für die zwei Werte als eine Gray-Code-Sequenz ist, dass ihre Werte sich nur um 1 Bit unterscheiden. Hier ist eine Lösung für dieses Problem:

def isGrayCode(num1, num2): 
    differences = 0 
    while (num1 > 0 or num2 > 0): 
     if ((num1 & 1) != (num2 & 1)): 
      differences++ 
     num1 >>= 1 
     num2 >>= 1 
    return differences == 1 
+0

Vielen Dank für die Hilfe !!! :) – user3923643

+4

Diese Antwort ist falsch. Siehe [Morwenns Antwort] (http://stackoverflow.com/questions/27218894/how-to-find-if-two-numbers-are-consecutive-numbers-in-gray-code-sequence/27332721#27332721). –

+0

Was ist falsch an meiner Antwort? –

22

Eigentlich einige der anderen Antworten scheinen falsch: Es ist wahr, dass zwei binären Gray-Code reflektiert Nachbarn von nur einem Bit unterscheiden (Ich gehe davon aus, dass durch «die» Grau Codefolge, du meinst die ursprüngliche binär reflektierte Gray-Code-Sequenz wie von Frank Grey beschrieben). Das bedeutet jedoch nicht, dass zwei Gray-Codes, die sich um ein Bit unterscheiden, Nachbarn sind (a => b bedeutet nicht, dass b => a). Zum Beispiel unterscheiden sich die Gray-Codes 1000 und 1010 nur um ein Bit, sind aber keine Nachbarn (1000 und 1010 sind jeweils 15 und 12 in Dezimal).

Wenn Sie wissen möchten, ob zwei Gray-Codes a und b Nachbarn sind, müssen Sie überprüfen, ob 10. Für einen gegebenen Gray-Code erhalten Sie einen Nachbarn, indem Sie das äußerste rechte Bit und das andere benachbarte Bit spiegeln, indem Sie das Bit links vom am weitesten rechts gesetzten Bit umdrehen. Für den Gray-Code 1010 sind die Nachbarn 1011 und 1110 (1000 ist keiner von ihnen).

Ob der vorherige oder der nächste Nachbar durch das Spiegeln eines dieser Bits erreicht wird, hängt von der Parität des Gray-Codes ab. Da wir jedoch beide Nachbarn haben wollen, müssen wir nicht auf Parität prüfen. Der folgende Pseudo-Code sollte Ihnen sagen, ob zwei Gray-Codes sind Nachbarn (C-ähnliche Bit-Operationen verwendet wird):

function are_gray_neighbours(a: gray, b: gray) -> boolean 
    return b = a^1 OR 
      b = a^((a & -a) << 1) 
end 

Bit Trick oben: a & -a isoliert die rigthmost gesetzte Bit in einer Zahl. Wir verschieben dieses Bit um eine Position nach links, um das Bit zu erhalten, das wir umkehren müssen.

+2

Tolle Lösung. Dies ist das Beste von allen und das richtige auch. Netter Jobmann. –

+0

Basierend auf der akzeptierten Antwort unter https: //math.stackexchange.com/questions/965168/Finde die Nachbarn-in-Grau-Code-Sequenz, Dein Pseudo-Code ist nicht in der Lage, alle Nachbarmöglichkeiten zu durchlaufen. Beispiel für zwei Gray-Code-Sequenzen gleicher Länge: [000,001,011,010,110,111,101,100], [000,001,011,111,101,100,110,010]. Der Code 000 könnte mehr als zwei legitime Nachbarn haben. –

+0

@DiWu Natürlich geht meine Antwort von einer binär reflektierten Gray-Code-Sequenz aus, die im Allgemeinen diejenige ist, über die Leute herfallen, wenn nichts angegeben ist. – Morwenn

-1

Wenn Sie wollen einfach nur prüfen, ob die Eingabe von Zahlen nur durch ein Bit unterscheiden:

public boolean checkIfDifferByOneBit(int a, int b){ 
    int diff = 0; 
    while(a > 0 && b > 0){ 
     if(a & 1 != b & 1) 
      diff++; 
     a = a >> 1; 
     b = b >> 1; 
    } 
    if (a > 0 || b > 0) // a correction in the solution provided by David Jones 
     return diff == 0 // In the case when a or b become zero before the other 
    return diff == 1; 
} 
1

Annahmen: Eingänge a und b sind Gray-Code-Sequenzen in binären Gray-Code reflektiert. , d. H. Die Bitkodierung von a und b ist eine Binärgraukodendarstellung.

#convert from greycode bits into regular binary bits 
def gTob(num): #num is binary graycode 
    mask = num >> 1 
    while mask!=0: 
     num = num^mask 
     mask >>= 1 
    return num; #num is converted 

#check if a and b are consecutive gray code encodings 
def areGrayNeighbors(a,b): 
    return abs(gTob(a) - gTob(b)) == 1 

paar Testfälle:

  • areGrayNeighbors (9,11) -> True (seit (1001, 1011) unterscheiden sich nur in einem Bit und sind aufeinanderfolgende Zahlen in Dezimaldarstellung)
  • areGrayNeighbors (9,10) -> false
  • areGrayNeighbors (14,10) -> True

Referenzen: Methode GTOB() verwendet wird, ist von oben in diesem Beitrag rodrigo The neighbors in Gray code

-1

Sie können prüfen, ob zwei Zahlen, die durch ein Bit oder nicht, unterscheiden sich wie folgt. Bei dieser Methode wird auf Unterschiede in der Länge der Binärzahlen geachtet. ZB wird die Ausgabe für 11 (1011) und 3 (11) als wahr zurückgegeben. Dies löst auch nicht das zweite Kriterium für Gray-Code-Nachbarschaft. Aber wenn Sie nur überprüfen möchten, ob sich die Zahlen um ein Bit unterscheiden, hilft der folgende Code.

class Graycode{ 
    public static boolean graycheck(int one, int two){ 
     int differences = 0; 
     while (one > 0 || two > 0){ 
      // Checking if the rightmost bit is same 
      if ((one & 1) != (two & 1)){ 
       differences++; 
      } 
      one >>= 1; 
      two >>= 1; 
     } 
     return differences == 1; 
    } 
    public static void main(String[] args){ 
     int one = Integer.parseInt(args[0]); 
     int two = Integer.parseInt(args[1]); 
     System.out.println(graycheck(one,two)); 
    } 
} 
+0

Für was ist die Abstimmung unten? Ich habe klar gesagt, dass diese Methode nur die ersten Kriterien überprüft. Bei Interviews in Tech-Unternehmen wurde ich gebeten, den Code für diese spezielle Aufgabe zu schreiben, und sie waren nicht an dem genauen Gray-Code-Adjazenztest interessiert. – Aswin

0
public int checkConsecutive2(int b1, int b2){ 
    int x = (b1^b2); 

    if((x & (x - 1)) !=0){ 
     return 0; 
    }else{ 
     return 1; 
    } 

} 
+1

Bitte fügen Sie eine kleine Erklärung hinzu, warum Sie glauben, dass dies die Frage des OP beantwortet. – iRuth

+0

Haben Sie versucht, die angenommene Antwort und Morwenns zu lesen und zu verstehen, und warum werden sie anders bewertet? – greybeard

0

Wenn zwei Zahlen in Gray-Code-Sequenz sind, unterscheiden sie sich durch eine Binärziffer. d. h. das Exklusiv-ODER der beiden Zahlen ergibt eine Potenz von 2. Suchen Sie also XOR und prüfen Sie, ob das Ergebnis eine Zweierpotenz ist.

Diese Lösung funktioniert gut für alle oben beschriebenen Testfälle von CodeKaichu. Ich würde gerne wissen, ob es in jedem Fall scheitert.

public boolean grayCheck(int x, int y) { 
     int z = x^y; 
     return (z&z-1)==0; 
} 
0

Eine offensichtliche Antwort, aber es funktioniert. Konvertieren Sie jeden grauen Code in seine jeweilige binäre Form, subtrahieren Sie die beiden. Wenn Sie eine binäre Entsprechung von +1 oder -1 annehmen, sind die zwei grauen Codes nebeneinander.

Dies scheint wie eine Übertötung, aber wenn Sie in einem Interview Standort und nicht die richtige Methode kennen, funktioniert das. Auch zur Optimierung kann man den Einbit-Differenzfilter überprüfen, so dass wir keine Zeit damit verschwenden, Zahlen zu konvertieren und zu subtrahieren, von denen wir wissen, dass sie nicht benachbart sind.

Verwandte Themen