Я бы предложил использовать структуру данных Trie .Он предназначен для хранения слов и сопоставления их значения.
Преимущества дерева по сравнению с хэш-картой следующие:
- Поиск элемента быстрее
- Нет столкновений
- Простые способыпройти через три или вернуть все значения в алфавитном порядке
- Простая реализация (без хэш-функции, без связанных списков ...).Это простое дерево.
Обычно использование памяти в трие меньше, чем в хэш-таблице, но в худшем случае оно будет использовать больше памяти.
Еще более эффективноструктура данных для этой цели - DAWG (или детерминированный ациклический конечный автомат), но его построение гораздо сложнее, поэтому, если у вас нет миллионов узлов в вашем графике, я бы предложил вам придерживатьсяTrie.
Возможная реализация в C будет выглядеть следующим образом: Структура данных:
#include <stdlib.h>
#include <stdio.h>
#define ALPHABET_SIZE 26
#define IMPOSSIBLE_VALUE -42
typedef struct TrieNode_struct {
struct TrieNode_struct *children[ALPHABET_SIZE];
int value;
} TrieNode_t;
typedef TrieNode_t *Trie_t;
TrieNode_t *new_node() {
TrieNode_t *new_node = malloc(sizeof(TrieNode_t));
new_node->value = IMPOSSIBLE_VALUE;
for (int i = 0; i < ALPHABET_SIZE; i++) {
new_node->children[i] = NULL;
}
return new_node;
}
int char_to_idx(char c){
return c - 'a';
}
Вставить пару строка / значение в три
void trie_insert_rec(TrieNode_t *node, char *str, int val, int depth) {
if (str[depth] == '\0') {
node->value = val;
} else {
if (node->children[char_to_idx(str[depth])] == NULL) {
node->children[char_to_idx(str[depth])] = new_node();
}
trie_insert_rec(node->children[char_to_idx(str[depth])], str, val, depth+1);
}
}
void trie_insert(Trie_t trie, char *str, int val) {
trie_insert_rec(trie, str, val, 0);
}
Поискдля значения в поле:
int trie_fetch_rec(TrieNode_t *node, char *str, int depth) {
if (str[depth] == '\0') {
return node->value;
} else if (node->children[char_to_idx(str[depth])] == NULL) {
return IMPOSSIBLE_VALUE;
} else {
return trie_fetch_rec(node->children[char_to_idx(str[depth])], str, depth+1);
}
}
int trie_fetch(TrieNode_t *node, char *str){
return trie_fetch_rec(node, str, 0);
}
Крошечный игрушечный тест
int main() {
Trie_t trie = new_node();
char str[5] = "john\0";
trie_insert(trie, str, 11);
printf("%d\n", trie_fetch(trie, str));
}