2009-11-19 11 views
5

Кто-нибудь знает библиотеку для кодирования ряда примитивных типов (например, целые числа, поплавки, строки и т. Д.) В строку, но сохраняя типы lexicographical order?Строковое кодирование примитивных типов, сохраняющих лексикографический порядок

В идеале, я ищу библиотеку C++, но другие языки тоже прекрасны. Кроме того, можно предположить, что формат не обязательно должен быть закодирован в самой строке (то есть, если это int64/string/float, тогда закодированная строка не нуждается в кодировании этой информации, достаточно только кодирования данных).

+0

Не могли бы вы уточнить, что вы хотите? – 2009-11-19 03:35:59

+1

Что вы подразумеваете под лексикографическим порядком относительно целых чисел и поплавков? Их лексикографическая сортировка зависит от того, как вы их кодируете, например. двоичный, восьмеричный, десятичный, шестнадцатеричный и т. д. (при условии, что удаляются ведущие разряды) все будут давать разные лексикографические виды для заданного списка чисел. –

+0

По лексикографическому порядку я имею в виду исходный порядок примитивных типов (не строка, очевидно). Скажите, кодируйте «(a, b, c)» в строку «s», что «(a, b, c) <(a ', b', c ')" подразумевает, что s nilton

ответ

0

Просто введите числовые значения в фиксированной ширине столбца с ведущими нулями и строки как обычно. Так как это:

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

Тогда можно сортировать как текст (например, Unix sort без -n). Как насчет этого?

+0

Я хотел бы избежать кодирования чисел в фиксированной ширине. Кроме того, строки кодирования, поскольку они не будут работать, дают правильный порядок сортировки, если строка имеет тот же символ, который вы используете в качестве разделителя. – nilton

+0

Затем напишите свой собственный порядок сортировки. –

9

Взгляните на этот документ («Эффективное лексикографическое кодирование чисел»), в котором показано, как представлять любой числовой тип в виде строки, такой как лексикографический порядок строк, совпадает с порядковым номером базовых чисел. Он справляется с произвольными номерами длин.

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

+0

Интересно ... Я смотрю на газету. – nilton

+2

Только что это реализовано. Работы были незначительными. Символ '' + ''ASCII имеет целочисленное значение 43, которое меньше и'' 0'' (целое значение 48). Это обеспечивает неправильную семантику сортировки. Используя символ, который выше в плоскости ASCII, например '' = ''(целочисленное значение 61), дает правильные результаты даже при сравнении строк с другим числом префиксных символов. –

2

У меня была проблема преобразования целых и длинных позиций в строках, которые сохраняют порядок. И так как я работал на Java, у меня были только подписанные типы.

Мой алгоритм был очень прост:

  1. Флипа знакового бит (toEncode^Long.MAX_VALUE для длинных позиций) в противном случае отрицательных чисел больше, чем положительные числа.
  2. Сделайте модифицированное кодирование байтов base64. К сожалению, нормальная кодировка base64 не сохраняет порядок; специальные символы (+ и /) находятся после цифр, которые после символов. Это полностью назад от ASCII. Мое измененное кодирование просто использует порядок ASCII. (Для того, чтобы понять, что не было нормально base64, я изменил специальные символы в - и _ с ~ как дополнения. Они по-прежнему полезной в пределах URL, который был еще одним сдерживающим фактором у меня было.)
2

BTW ... В SimpleDB веб-службы Amazon все данные хранятся в виде строк. Его select компараторы используют лексикографическое упорядочение. AWS предоставляет функции утилиты для кодирования различных типов. Например, целые числа кодируются, зная диапазон целых чисел apriori и настраивая с помощью нулевого заполнения и смещения (например, для отрицательных целых чисел). Конечно, вы могли бы дать ему наихудший возможный диапазон.

См "Запрос 201: Советы и хитрости для Amazon SimpleDB Query" - http://aws.amazon.com/articles/1232

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

 Смежные вопросы

  • Нет связанных вопросов^_^