2009-11-19 10 views
5

Kennt jemand eine Bibliothek für die Codierung einer Reihe von primitiven Typen (wie Integer, Floats, Strings, etc.) in eine Zeichenfolge, aber die lexicographical order der Typen erhalten?String Encoding von primitiven Typen mit lexikographischer Ordnung

Idealerweise suche ich nach einer C++ - Bibliothek, aber auch andere Sprachen sind in Ordnung. Man kann auch annehmen, dass das Format nicht in der Zeichenkette selbst codiert werden muss (das heißt, wenn es int64/string/float ist, dann muss die codierte Zeichenkette diese Information nicht codieren, nur die Codierung der Daten ist ausreichend).

+0

Können Sie erklären, was Sie wollen? –

+1

Was meinst du mit lexikographischer Ordnung in Bezug auf ganze Zahlen und schwimmt? Ihre lexikographische Sortierung hängt davon ab, wie Sie sie codieren, z. binär, oktal, dezimal, hex usw. (unter der Annahme, dass führende Ziffern entfernt werden), werden alle für eine gegebene Liste von Zahlen unterschiedliche lexikografische Arten ergeben. –

+0

Mit lexikographischer Reihenfolge meine ich die ursprüngliche Reihenfolge der primitiven Typen (nicht die Zeichenfolge, offensichtlich). Sagen wir, kodiere "(a, b, c)" in eine Zeichenkette "s", so dass "(a, b, c) <(a ', b', c ')" impliziert, dass "s nilton

Antwort

0

Schreiben Sie einfach numerische Werte in einer festen Spaltenbreite mit führenden Nullen und Strings als normal. So wie folgt aus:

0.1 -> 0000000.1000000 
123 -> 0000123.0000000 
foo -> foo 
X -> X 

Dann können Sie als Text sortieren (z Unix sort ohne -n). Wie ist es damit?

+0

Ich möchte Kodierungsnummern in fester Breite vermeiden. Auch das Codieren von Zeichenfolgen als selbst funktioniert nicht, wenn Sie die richtige Sortierreihenfolge haben, wenn die Zeichenfolge das gleiche Zeichen hat, das Sie als Trennzeichen verwenden. – nilton

+0

Dann schreiben Sie Ihre eigene Sortierroutine. –

9

Werfen Sie einen Blick auf dieses Dokument ("Efficient Lexicographic Encoding of Numbers"), das zeigt, wie man einen numerischen Typ als String darstellt, so wie die lexikographische Reihenfolge der Strings dieselbe wie die numerische Reihenfolge der zugrunde liegenden Zahlen ist. Es kommt mit willkürlichen Längenzahlen zurecht.

http://www.zanopha.com/docs/elen.pdf

+0

Interessant ... Ich schaue mir die Zeitung an. – nilton

+2

Dies wurde gerade implementiert. Works bot eine geringfügige Änderung. Das ASCII-Zeichen "+" hat den ganzzahligen Wert 43, der niedriger ist, und "0" (ganzzahliger Wert 48). Dies liefert eine falsche Sortier-Semantik. Durch Verwendung eines Zeichens, das höher in der ASCII-Ebene liegt, wie "=" (Ganzzahlwert 61), werden korrekte Ergebnisse erzielt, selbst wenn Strings mit einer anderen Anzahl von Präfixzeichen verglichen werden. –

2

hatte ich das Problem der ganzen Zahlen und sehnt sich in Strings konvertiert werden, die Ordnung bewahren. Und da ich in Java arbeitete, hatte ich nur Typen signiert.

Mein Algorithmus war sehr einfach:

  1. Flip das Vorzeichenbit (toEncode^Long.MAX_VALUE für Long-Positionen), ansonsten negative Zahlen sind größer als positive Zahlen.
  2. Tun Sie eine modifizierte Base64-Codierung der Bytes. Leider behält die normale base64-Codierung die Reihenfolge nicht bei. Die Sonderzeichen (+ und /) sind hinter den Zahlen, die nach den Zeichen stehen. Dies ist vollständig rückwärts von ASCII. Meine modifizierte Codierung verwendet einfach die ASCII-Reihenfolge. (Um es klar, dass es nicht normal base64 war, änderte ich die Sonderzeichen zu - und _ mit ~ als Polsterung. Diese trozdem sind innerhalb einer URL, die andere war eine Einschränkung ich hatte.)
2

BTW ... In SimpleDB von Amazon Web Service werden alle Daten als Zeichenfolgen gespeichert. Seine select Komparatoren verwenden lexikographische Ordnung. AWS bietet Dienstprogrammfunktionen zum Codieren verschiedener Typen. Zum Beispiel werden Ganzzahlen kodiert, wobei der Bereich der ganzen Zahlen apriori bekannt ist und über Null-Auffüllung und Offsets (z. B. für negative ganze Zahlen) eingestellt wird. Du könntest es natürlich die schlechteste Bandbreite geben.

Siehe "Query 201: Tipps und Tricks für Amazon SimpleDB Query" - http://aws.amazon.com/articles/1232

http://typica.s3.amazonaws.com/com/xerox/amazonws/sdb/DataUtils.html

Verwandte Themen