亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中trie字典樹是什么

發布時間:2021-11-25 09:10:40 來源:億速云 閱讀:124 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關C語言中trie字典樹是什么的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

字典樹介紹

字典樹簡單的是用一個二維數組表示,如果想更加節省空間,大神的做法肯定是用指針鏈表來搞定了。比如我們用g_trie[i][j]=k這個二維數組表示字典樹,那么他們的含義有三點,i,j,k,這個是字典樹的核心,只有理解i,j,k代表的意義,才能更好的去寫代碼構建字典樹,運用字典樹。

i >>>這個可以理解為根節點(上面的e,k字符都可以認為是i),如果這個沒有孩子,下面沒有分支,就可以理解為i

j>>>j可以理解為i的孩子,他的值意思就是第幾個孩子的意思

k>>>這個我認為就是一共有多少個字符,統計所有字符數量的意思

實例代碼

#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'; 這個是為了節省空間,本來數組建立的字典樹就浪費了很多空間,這個寫法能節省很多空間。

if(g_trie[g_root][id] == 0) 我們在前面已經初始化數組為,這里如果檢測是,那么就說明里面沒有東西,就可以往里面存東西。

用鏈表實現的字典樹代碼

// 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

}

感謝各位的閱讀!關于“C語言中trie字典樹是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陇西县| 望城县| 亳州市| 澄城县| 清新县| 凌海市| 民乐县| 海林市| 东方市| 东明县| 南郑县| 沙湾县| 株洲县| 华坪县| 临漳县| 上高县| 定陶县| 贺州市| 马山县| 湛江市| 平和县| 莱芜市| 永春县| 南部县| 偃师市| 西乌珠穆沁旗| 章丘市| 公主岭市| 依安县| 宁城县| 呼图壁县| 镇巴县| 吴川市| 和顺县| 宁河县| 黔江区| 高青县| 城固县| 抚远县| 清丰县| 甘孜县|