Отображение Char * на два целых числа - PullRequest
0 голосов
/ 30 июня 2018

Я ищу самый быстрый способ сопоставить строку с двумя целыми числами и сопоставить эти целые числа со строкой.

Это структура для каждого элемента:

  • char * name
  • uint32_t license_id
  • uint32_t ss_id

Каждое поле уникально, все поля являются константами, и после компиляции элементы не будут добавлены. Поскольку они уникальны, я хочу сделать следующие функции поиска:

uint32_t get_license_from_name(char *name);
uint32_t get_ssid_from_name(char *name);
void get_name_from_license(uint32_t license, char *name);
void get_name_from_ssid(uint32_t ssid, char *name);

По результатам поиска я знаю, что можно создать отдельную хэш-карту для каждой пары поисковых терминов. Это мой лучший выбор? Я надеялся, что смогу воспользоваться тем фактом, что эти значения всегда известны, в отличие от других вопросов, которые я нашел.

Есть ли решение O (1) для этой проблемы?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Было бы полезно дать некоторые подробности о значениях. Если значения изначально были целыми числами, которые были преобразованы в массив символов для транспорта, то проблему можно решить, приведя ее к типу int. В противном случае, ваш лучший вариант - использовать такие функции stdlib.h, как atoi () и atoc ().

Исходя из вашего примера кода, похоже, что вы пытаетесь извлечь два значения из одного и того же массива символов. В этом случае я бы порекомендовал использовать memcpy () следующим образом.

/* Based on what you wrote above I am assuming name is 8 bytes  */
int firstValueSize = 4/* whatever size in bytes the first number should be */;
int secondValueSize = 4/* Same with this */;
int *firstValue = (int)malloc(sizeof(int));
int *secondValue = (int)malloc(sizeof(int));
memcpy(firstValue, name, sizeof(firstValueSize));
memcpy(secondValue, name + firstValueSize, sizeof(secondValueSize));

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

0 голосов
/ 30 июня 2018

Как насчет использования только одного набора, реализованного двоичным деревом?

Key:
     {name, license, ssid}

Function Compare:

     name_compare(name1, name2) || license_compare(license1, license2) || ssid_compare(ssid1, ssid2)

Это поиск O (logN).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...