2015-05-17 9 views
6

Я занимаюсь финансовыми работами. У меня есть набор символов запаса, но у них очень четкая схема: состоит из двух символов AB, ACAD и текущий месяц, который представляет собой четырехзначное число: 1503, , 1505. Вот некоторые примеры:Как сопоставить специализированную строку в указанное целое

AB1504 
AB1505 
AC1504 
AC1505 
AD1504 
AD1505 
.... 

Поскольку эти строки так хорошо продуманы с рисунком, я хочу, чтобы отобразить (хэш), каждый из строки в уникальное целое число, так что я могу использовать целое число в качестве индекса массива для быстрого ACCESSING, так как у меня много изъятий внутри моей системы, и std::unordered_map или любая другая карта хэша не достаточно быстра. У меня есть тесты, показывающие, что общая хэш-карта - это уровень латентности в сто-наносекунд, в то время как индексирование массива всегда меньше 100 нанометров. Моим идеальным случаем было бы, например, AB1504 карты для целого числа 1, AB1505 maps to 2 ...., тогда я могу создать массив внутри, чтобы получить доступ к информации, относящейся к этим символам, намного быстрее. Я пытаюсь выяснить некоторые алгоритмы хеширования или другие методы, которые могут достичь моей цели, но не смогли узнать. У вас есть предложения по этой проблеме?

+0

Одна простая идея: посмотрите на свой шаблон как шестнадцатеричное (или более высокое воображаемое основание) число и преобразуйте его в десятичную, чтобы получить уникальный номер. хотя он не начинается с 0, и они не являются последствием. – Emadpres

+0

Вы также можете попробовать что-то вроде сжатия данных (zlib, Huffman, lzw и т. д.) и предварительно делить данные декомпрессии (повторно использовать его для всех ваших сообщений или «развиваться» он «детерминированно по каждой стороне связи), так что сообщения не имеют« заголовочных »данных в качестве служебных. –

+0

У вас есть дополнительная информация о формате чисел? Как две первые цифры представляют годы после 2000 года? Что означают буквы, если что-нибудь? Вам нужно обращаться к вещам раньше, чем AA1501 (или аналогичным)? – holroy

ответ

0

Если вы разобрали строку в виде смешанного базового номера, сначала 2-х базовых-26 цифр, а затем 4 базы-10 цифр, вы быстро получите уникальный индекс для каждой строки. Единственная проблема заключается в том, что если вы можете получить малонаселенный массив.

Вы всегда можете изменить порядок цифр при расчете индекса, чтобы минимизировать проблему, упомянутую выше.

Поскольку числа на самом деле являются месяцами, я бы вычислил количество месяцев с первой записи и умножьте их на 2-значный номер base-26 из префикса.

Надеюсь, вы можете сделать некоторые из этого, набрав на моем планшете на данный момент. : D

0

Следующие значения должны быть представимы 32-разрядным целым числом:

XYnnnn => (26 * X + Y) * 10000 + nnnn 

Здесь X и Y принимают значения в диапазоне [0, 26), и n принимают значения в диапазоне [0 , 10).

У вас есть всего 6,760,000 представляемых значений, поэтому, если вы хотите связать с ним небольшой объем данных (например, счетчик или указатель), вы можете просто создать плоский массив, где каждый символ занимает один массив запись.

1

Вы можете рассматривать строку как представление числа с переменной базой и преобразовывать ее в целое число. Например:

AC1504: 
A (range: A-Z) 
C (range: A-Z) 
15 (range: 0-99) 
04 (range: 1-12) 

Извлечь детали; то хэш-функция может быть

int part1, part2, part3, part4; 
... 
part1 -= 'A'; 
part2 -= 'A'; 
part4 -= 1; 
return (((part1 * 26 + part2) * 100 + part3) * 12 + part4; 
0

Я предполагаю, что формат «AAyymm», где А является прописной YY персонажу двузначного года и мм двузначного месяца.

Следовательно, вы можете сопоставить его с битами 10 (AA) + Y (yy) + 4 (mm). где Y = 32 - 10 - 4 = 18 бит для 32-битного представления (или 262144 года). Имея это, вы можете представить формат как целое число, переместив символы туда и переместив пары год и месяц туда, после преобразования их в целое.

Примечание: Там всегда будет пробелы в двоичном представлении, Здесь битового представления для символов (6 + 6 значений) в 5 + 5 и в 4 битном месяца представления (4 значения)

Чтобы избежать пробелы меняют представление на ABmmmm, были ли пары AB представлены числом 26 * A + B, а mmmm - месяц относительно некоторого нулевого месяца в течение некоторого года (который охватывает 2^32/1024/12 = 349525 лет - имея 32 бита).

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