2009-11-19 11 views
5

¿Alguien sabe de una biblioteca para codificar una serie de tipos primitivos (como enteros, flotantes, cadenas, etc.) en una cadena pero conservando el lexicographical order de los tipos?Codificación de cadena de tipos primitivos que conservan el orden lexicográfico

Idealmente, estoy buscando una biblioteca C++, pero otros idiomas también están bien. Además, se puede suponer que el formato no necesita ser codificado en la cadena misma (es decir, si es int64/cadena/float, entonces la cadena codificada no necesita codificar esta información, solo codificar los datos es suficiente).

+0

Podría aclarar lo que quiere? –

+1

¿Qué quiere decir con orden lexicográfico con respecto a enteros y carrozas? Su clasificación lexicográfica depende de cómo los codifique, p. Ej. binario, octal, decimal, hex, etc. (suponiendo que se eliminen los dígitos iniciales), todos darán diferentes tipos lexicográficos para una lista dada de números. –

+0

Por orden lexicográfico quiero decir, el orden original de los tipos primitivos (no la cadena, obviamente). Decir, codificar "(a, b, c)" en una cadena "s", tal que "(a, b, c) <(a ', b', c ')" implica que "s nilton

Respuesta

0

Simplemente escriba valores numéricos en un ancho de columna fijo con ceros a la izquierda, y cadenas como de costumbre. Así como esto:

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

A continuación, se puede ordenar en forma de texto (por ejemplo Unix sort sin -n). ¿Qué hay sobre eso?

+0

Me gustaría evitar codificar números en ancho fijo. Además, las cadenas de codificación como ellas mismas no funcionarán si dan el orden correcto de clasificación si la cadena tiene el mismo carácter que está utilizando como separador. – nilton

+0

Luego escribe tu propia rutina de clasificación. –

9

Eche un vistazo a este documento ("Codificación lexicográfica eficiente de números") que muestra cómo representar cualquier tipo numérico como una cadena, ya que el orden lexicográfico de las cadenas es el mismo que el orden numérico de los números subyacentes. Hace frente a números de longitud arbitrarios.

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

+0

Interesante ... Estoy echando un vistazo al periódico. – nilton

+2

Acabo de implementar esto. Las obras proporcionaron una modificación menor. El carácter ASCII ''+'' tiene un valor entero 43, que es más bajo y ''0'' (valor entero 48). Esto proporciona una semántica de clasificación incorrecta. Al usar un personaje que está más arriba en el plano ASCII, como ''='' (valor entero 61) da resultados correctos incluso cuando se comparan cadenas con un número diferente de caracteres de prefijo. –

2

que tenían el problema de la conversión de números enteros y anhela a las cadenas que preservan el pedido. Y como trabajaba en Java, solo tenía tipos firmados.

Mi algoritmo es muy simple:

  1. tirón el bit de signo (toEncode^Long.MAX_VALUE de largos) de lo contrario los números negativos son mayores que los números positivos.
  2. Realice una codificación base64 modificada de los bytes. Desafortunadamente, la codificación normal de base64 no conserva el orden; los caracteres especiales (+ y /) están detrás de los números que están detrás de los caracteres. Esto es completamente retroactivo desde ASCII. Mi codificación modificada simplemente usa el orden ASCII. (Para que quede claro que no era normal de base 64, he cambiado los caracteres especiales para - y _ con ~ como el relleno. Estos siguen siendo utilizable dentro de una URL, que era otra una restricción que tenía.)
2

BTW ... En SimpleDB de Amazon Web Service, todos los datos se almacenan como cadenas. Sus comparadores select usan ordenamiento lexicográfico. AWS proporciona funciones de utilidad para codificar varios tipos. Por ejemplo, los enteros se codifican conociendo el rango de los enteros apriori y ajustándolos a través de relleno cero y desplazamientos (por ejemplo, para enteros negativos). Por supuesto, podrías darle el peor rango posible.

Ver "Consulta 201: Consejos y trucos para Amazon SimpleDB consulta" - http://aws.amazon.com/articles/1232

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

Cuestiones relacionadas