您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)C語言中trie字典樹是什么的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
字典樹介紹
字典樹簡單的是用一個二維數(shù)組表示,如果想更加節(jié)省空間,大神的做法肯定是用指針鏈表來搞定了。比如我們用g_trie[i][j]=k這個二維數(shù)組表示字典樹,那么他們的含義有三點,i,j,k,這個是字典樹的核心,只有理解i,j,k代表的意義,才能更好的去寫代碼構(gòu)建字典樹,運(yùn)用字典樹。
i >>>這個可以理解為根節(jié)點(上面的e,k字符都可以認(rèn)為是i),如果這個沒有孩子,下面沒有分支,就可以理解為i
j>>>j可以理解為i的孩子,他的值意思就是第幾個孩子的意思
k>>>這個我認(rèn)為就是一共有多少個字符,統(tǒng)計所有字符數(shù)量的意思
實例代碼
#include "stdio.h"
#define false (0)
#define true (1)
int g_trie[100][100];
char g_str[100];
int g_root = ;
int g_tot = ;
void insert(char *s)
{
int id = ;
g_root = ;
while(*s != '\0')
{
id = *s++ - 'a';
if(g_trie[g_root][id] == )
{
g_trie[g_root][id] = ++g_tot;
}
g_root = g_trie[g_root][id];
}
}
int find_str(char *s)
{
g_root = ;
while(*s != '\0')
{
int id = *s++ -'a';
if(g_trie[g_root][id] == ) return false;
g_root = g_trie[g_root][id];
}
return true;
}
void main(void)
{
int N = ;
memset(g_trie, , sizeof(int) * 100 * 100);
scanf("%d",&N);
for(int i = ;i <= N;i++)
{
scanf("%s",g_str);
insert(g_str);
}
puts("Please input find string");
while(~scanf("%s",g_str))
{
if(find_str(g_str) == true)
{
puts("find str");
}
else
{
puts("find nothing!");
}
}
}
解釋
為什么 id =*s++- 'a'; 這個是為了節(jié)省空間,本來數(shù)組建立的字典樹就浪費(fèi)了很多空間,這個寫法能節(jié)省很多空間。
if(g_trie[g_root][id] == 0) 我們在前面已經(jīng)初始化數(shù)組為,這里如果檢測是,那么就說明里面沒有東西,就可以往里面存東西。
用鏈表實現(xiàn)的字典樹代碼
// C implementation of search and insert operations
// on Trie
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
// Alphabet size (# of symbols)
#define ALPHABET_SIZE (26)
// Converts key current character into index
// use only 'a' through 'z' and lower case
#define CHAR_TO_INDEX(c) ((int)c - (int)'a')
// trie node
struct TrieNode
{
struct TrieNode *children[ALPHABET_SIZE];
// isEndOfWord is true if the node represents
// end of a word
bool isEndOfWord;
};
// Returns new trie node (initialized to NULLs)
struct TrieNode *getNode(void)
{
struct TrieNode *pNode = NULL;
pNode = (struct TrieNode *)malloc(sizeof(struct TrieNode));
if (pNode)
{
int i;
pNode->isEndOfWord = false;
for (i = ; i < ALPHABET_SIZE; i++)
pNode->children[i] = NULL;
}
return pNode;
}
// If not present, inserts key into trie
// If the key is prefix of trie node, just marks leaf node
void insert(struct TrieNode *root, const char *key)
{
int level;
int length = strlen(key);
int index;
struct TrieNode *pCrawl = root;
for (level = ; level < length; level++)
{
index = CHAR_TO_INDEX(key[level]);
if (!pCrawl->children[index])
pCrawl->children[index] = getNode();
pCrawl = pCrawl->children[index];
}
// mark last node as leaf
pCrawl->isEndOfWord = true;
}
// Returns true if key presents in trie, else false
bool search(struct TrieNode *root, const char *key)
{
int level;
int length = strlen(key);
int index;
struct TrieNode *pCrawl = root;
for (level = ; level < length; level++)
{
index = CHAR_TO_INDEX(key[level]);
if (!pCrawl->children[index])
return false;
pCrawl = pCrawl->children[index];
}
return (pCrawl != NULL && pCrawl->isEndOfWord);
}
// Driver
int main()
{
// Input keys (use only 'a' through 'z' and lower case)
char keys[][8] = {"the", "a", "there", "answer", "any",
"by", "bye", "their"};
char output[][32] = {"Not present in trie", "Present in trie"};
struct TrieNode *root = getNode();
// Construct trie
int i;
for (i = ; i < ARRAY_SIZE(keys); i++)
insert(root, keys[i]);
// Search for different keys
printf("%s --- %s\n", "the", output[search(root, "the")] );
printf("%s --- %s\n", "these", output[search(root, "these")] );
printf("%s --- %s\n", "their", output[search(root, "their")] );
printf("%s --- %s\n", "thaw", output[search(root, "thaw")] );
return ;
}
感謝各位的閱讀!關(guān)于“C語言中trie字典樹是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。