Zuordnen von zwei ganzen Zahlen zu einer einzigen und deterministischen Art
Stellen Sie sich zwei positive ganze zahlen A und B. ich will verbinden, diese beiden in einer einzigen integer-C.
Kann es keine anderen ganzen zahlen D und E, die kombinieren, um C.
So ist die Kombination mit den Additions-operator nicht funktioniert. ZB 30 + 10 = 40 = 40 + 0 = 39 + 1
Weder concatination Arbeit. ZB "31" + "2" = 312 = "3" + "12"
Diese Kombination sollte die Zusammenarbeit auch deterministisch (immer ergeben das gleiche Ergebnis mit den gleichen Eingaben) und sollte immer die Rendite eine ganze Zahl auf entweder die positive oder die negative Seite der ganzen zahlen.
InformationsquelleAutor der Frage harm | 2009-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du suchst eine bijektive
NxN -> N
mapping. Diese werden verwendet für z.B. Verschränkung. Haben Sie einen Blick auf dieses PDF für eine Einführung in die so genannte pairing-Funktionen. Wikipedia führt einen speziellen pairing-Funktion, nämlich die Cantor-pairing-Funktion:Drei Anmerkungen:
ZxZ -> N
mapping. Cantor - Funktion funktioniert nur auf nicht-negative zahlen. Dies ist kein problem, jedoch, weil es einfach zu definieren, eine bijectionf : Z -> N
etwa so:InformationsquelleAutor der Antwort Stephan202
Cantor-pairing-Funktion ist wirklich einer der besseren gibt, bedenkt man seine einfache, schnell und Platz sparend, aber es ist sogar noch etwas besser veröffentlicht bei Wolfram von Matthew Szudzik, hier. Die Beschränkung des Cantor-pairing-Funktion (relativ) ist, dass der Bereich der codierten Ergebnisse, die nicht immer innerhalb der Grenzen einer
2N
bit-Ganzzahl, wenn die Eingänge sind zweiN
bit-Ganzzahlen. Das ist, wenn meine Eingaben sind zwei16
- bit-Integer reicht von0 to 2^16 -1
dann gibt es2^16 * (2^16 -1)
Kombinationen von Produktionsfaktoren möglich, so dass durch die offensichtliche Schublade Prinzipbenötigen wir eine output-Größe, die mindestens2^16 * (2^16 -1)
die gleich2^32 - 2^16
oder in anderen Worten, eine Karte von32
bit-zahlen sollte machbar sein ideal. Dies kann nicht von wenig praktischer Bedeutung in der Programmierung Welt.Cantor-pairing-Funktion:
Geben Sie Szudzik die Funktion:
Nun, in Anbetracht der Tatsache, dass wir in der Regel mit dem deal unterzeichnet Implementierungen von zahlen in verschiedenen Größen Sprachen/frameworks, betrachten wir
signed 16
- bit-Integer reicht von-(2^15) to 2^15 -1
(später werden wir sehen, wie Sie erweitern auch den Ausgang zu überspannen signed range). Daa
undb
müssen positiv sein, Sie reichen von0 to 2^15 - 1
.Cantor-pairing-Funktion:
Nun Szudzik die Funktion:
Let ' s Konto für negative Ganzzahlen. Das ist über die ursprüngliche Frage, ich weiß, aber gerade die Ausarbeitung zu helfen, die künftigen Besucher.
Cantor-pairing-Funktion:
Szudzik die Funktion:
Nun all dies, während die Ausgabe wurde immer positiv. In der Welt unterzeichnet, es wird noch mehr Platz sparen, wenn wir überführen könnte die Hälfte der Leistung, um negativen Achse. Sie es tun könnten, wie dies für Szudzik:
Was ich Tue: Nach der Anwendung ein Gewicht von
2
zu der die Eingänge und die Funktion, die ich teilen Sie dann die Ausgabe durch zwei und nehmen einige von Ihnen an, negative Achse durch Multiplikation mit-1
.Sehen die Ergebnisse, die für alle Eingaben in der Palette der unterzeichneten
16
bit-Zahl, die Ausgabe liegt innerhalb der Grenzen einer signierten32
bit-Ganzzahl, die ist cool. Ich bin mir nicht sicher wie Sie gehen über den gleichen Weg für die Cantor-pairing-Funktion, aber nicht versuchen, so viel wie es ist nicht so effizient. Darüber hinaus weitere Berechnungen beteiligt Cantor-pairing-Funktion bedeutet, dass Sie langsamer zu.Hier ist eine C# - Implementierung.
Da die Zwischenberechnungen können die Grenzwerte überschreiten von
2N
- Ganzzahl mit Vorzeichen, die ich verwendet habe4N
integer-Typ (die Letzte division durch2
bringt wieder das Ergebnis zu2N
).Den link habe ich auf die Alternative Lösung, der schön zeigt einen graph der Funktion unter Verwendung jeder einzelne Punkt im Raum. Seine erstaunlich, zu sehen, dass konnte man eindeutig Kodieren, ein paar Koordinaten auf eine einzelne Zahl reversibel! Magische Welt der zahlen!!
InformationsquelleAutor der Antwort nawfal
Wenn A und B können ausgedrückt werden mit 2 bytes, die Sie kombinieren können Sie auf 4 bytes. Setzen Sie Ein auf der die meiste bedeutende Hälfte und B auf das am wenigsten signifikante halb.
In der C-Sprache dies gibt (vorausgesetzt, sizeof(short)=2 und sizeof(int)=4):
InformationsquelleAutor der Antwort mouviciel
Ist das überhaupt möglich?
Sie sind die Kombination von zwei Ganzzahlen. Beide haben den Bereich -2,147,483,648 bis 2,147,483,647 aber Sie nehmen nur das positive.
Das macht 2147483647^2 = 4,61169 E+18 Kombinationen.
Da jede Kombination muss eindeutig sein UND im Ergebnis eine ganze Zahl, Sie müssen irgendeine Art von magischen integer enthalten kann, diese Menge von zahlen.
Oder ist meine Logik falsch?
InformationsquelleAutor der Antwort Boris Callens
Den üblichen mathematischen Weise für positive ganze zahlen ist, verwenden Sie die Einzigartigkeit des prime-Faktorisierung.
Der Nachteil ist, dass das Bild neigt zum span ziemlich großen Bereich von ganzen zahlen, so dass, wenn es um den Ausdruck der mapping in einen computer-Algorithmus, die Sie haben können Probleme mit der Auswahl eines geeigneten Typs für das Ergebnis.
Könnten Sie ändern diese beschäftigen sich mit negativen
x
undy
durch Kodierung eines flags mit Leistungen von 5 und 7 Bezug.z.B.
InformationsquelleAutor der Antwort CB Bailey
Lassen Anzahl
a
der erste, derb
die zweite. Lassen Siep
werden diea+1
-te Primzahl,q
werden dieb+1
-te PrimzahlDann, das Ergebnis ist
pq
wenna<b,
oder2pq
wenna>b
. Wenna=b
lass es seinp^2
.InformationsquelleAutor der Antwort ASk
f(a, b) = s(a+b) + a
wos(n) = n*(n+1)/2
dies mit der Tatsache:
s(a+b+1)-s(a+b) = a+b+1
.< a
Habe ich nicht verstanden was Du damit meinst:
Wie kann ich schreiben (größer als), (weniger als) Charaktere in diesem forum?
InformationsquelleAutor der Antwort libeako
Für positive Ganzzahlen als Argumente und where-argument ist die Reihenfolge egal:
Hier ist ein ungeordnete pairing-Funktion:
Für x ≠ y, hier ist ein einzigartige ungeordnete pairing-Funktion:
InformationsquelleAutor der Antwort ma11hew28
Obwohl Stephan202 s Antwort ist die einzige wirklich Allgemeine, für die ganze zahlen in einem begrenzten Bereich, den Sie besser machen können. Zum Beispiel, wenn Ihr Wertebereich ist 0..10.000, dann können Sie tun:
Ergebnisse passen in eine einzelne ganze Zahl, für einen Bereich bis zu der Quadratwurzel der integer-Typ Kardinalität. Diese packs etwas effizienter als Stephan202 die allgemeinere Methode. Es ist auch wesentlich einfacher zu entschlüsseln; erfordern keine Quadratwurzeln, für den Anfang 🙂
InformationsquelleAutor der Antwort bdonlan
Prüfen: http://en.wikipedia.org/wiki/Pigeonhole_principle. Wenn A, B und C sind vom gleichen Typ, es kann nicht getan werden. Wenn A und B sind 16-bit-Ganzzahlen, und C ist 32-bit, dann können Sie einfach schalten.
In der Natur der Hash-algorithmen ist, dass Sie nicht geben Sie einen eindeutigen hash für jeden anderen input.
InformationsquelleAutor der Antwort Groo
Ist es gar nicht so schwer zu konstruieren, die eine Zuordnung:
Herauszufinden, wie man den Wert für eine beliebige a,b ist ein wenig schwieriger.
InformationsquelleAutor der Antwort Dolphin
Hier ist eine Erweiterung der @DoctorJ 's code ankten ganzen zahlen, basierend auf der Methode von @nawfal. Es kann codieren und decodieren. Es funktioniert mit normalen arrays und numpy-arrays.
InformationsquelleAutor der Antwort NStarman
Was Sie vorschlagen, ist unmöglich. Sie haben immer Kollisionen.
Um die Karte zwei Objekte zu einem anderen einzigen Satz, der abgebildet einstellen muss mindestens die Größe von der Anzahl der Kombinationen erwartet:
Unter der Annahme einer 32-bit-Ganzzahl, haben Sie 2147483647 positive ganze zahlen sind. Die Wahl zwei von diesen, wo die Reihenfolge egal und mit Wiederholung ergibt 2305843008139952128 Kombinationen. Dieses passt nicht schön in der Reihe von 32-bit-Ganzzahlen.
Können Sie, jedoch passen diese Zuordnung in 61 bits. Mit einem 64-bit-Ganzzahl ist wahrscheinlich am einfachsten. Legen Sie das high-word auf die kleinere ganze Zahl und das low word zu den größeren.
InformationsquelleAutor der Antwort lc.
Wie über etwas viel einfacheres: Gegeben zwei zahlen, A und B lassen str der Verkettung: 'A' + ';' + 'B'. Dann lassen Sie die Ausgabe hash(str.). Ich weiß, dass dies nicht eine mathematische Antwort, aber ein einfaches python (die hat eine eingebaute hash-Funktion) Skript sollte den job tun.
InformationsquelleAutor der Antwort Madhav Nakar
lassen Sie uns zwei Zahl B und C , Codierung, in einer einzigen Zahl Eine
A = B + C * N
wo
B=A % N = B
C=A /N = C
InformationsquelleAutor der Antwort Ankur Chauhan