iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中trie字典树是什么
  • 828
分享到

C语言中trie字典树是什么

2023-06-03 09:06:18 828人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关C语言中trie字典树是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。字典树介绍字典树简单的是用一个二维数组表示,如果想更加节省空间,大神的做法肯定是用指针链表来搞定了。比如我们用g

这篇文章给大家分享的是有关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字典树是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: C语言中trie字典树是什么

本文链接: https://www.lsjlt.com/news/233944.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中trie字典树是什么
    这篇文章给大家分享的是有关C语言中trie字典树是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。字典树介绍字典树简单的是用一个二维数组表示,如果想更加节省空间,大神的做法肯定是用指针链表来搞定了。比如我们用g...
    99+
    2023-06-03
  • 详解Java中字典树(Trie树)的图解与实现
    目录简介工作过程数据结构初始化构建字典树应用匹配有效单词关键词提示总结简介 Trie又称为前缀树或字典树,是一种有序树,它是一种专门用来处理串匹配的数据结构,用来解决一组字符中快速查...
    99+
    2024-04-02
  • C语言中二叉树的常见操作是什么
    这篇文章主要讲解了“C语言中二叉树的常见操作是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中二叉树的常见操作是什么”吧!一、基本概念每个结点最多有两棵子树,左子树和右子树,次序不...
    99+
    2023-06-08
  • c语言中::是什么
    c++kquote>c++ 中的双冒号 (::) 用于:1. 全局命名空间访问;2. 命名空间限定;3. 枚举常量访问;4. 静态方法调用;5. 基类引用。 C++中的双冒号 (...
    99+
    2024-04-13
    c语言 c++
  • c语言中?:是什么
    在 c 语言中,: 是条件运算符,又称三元运算符,可根据条件布尔表达式在两个值之间进行选择。其语法为:condition value_if_true : value_if_false。...
    99+
    2024-04-13
    c语言
  • c语言是什么语言
    c语言作为一种通用、过程式编程语言,自诞生以来一直是计算机领域最流行的语言之一。其简洁高效、跨平台、强大的控制能力、丰富的库函数和可扩展性等特点,使其广泛应用于系统软件开发、嵌入式系统开...
    99+
    2024-03-14
    c语言 网络编程 作用域 c语言编程 标准库
  • c语言中size是什么
    size 是 c 语言中用于获取数据类型大小的运算符,返回 unsigned int 类型的字节数。其作用为:分配内存;数据处理;数据对齐。 C 语言中的 size size 是 C...
    99+
    2024-05-08
    c语言
  • c语言中bool是什么
    c 语言中的 bool 类型用于表示布尔值,即真或假,需要包含头文件 。bool 变量可以赋值为 true 或 false,并可以使用 ==、!= 等运算符比较。c 语言还提供 &...
    99+
    2024-05-08
    c语言
  • c语言中%s是什么
    在 c 语言中,%s 是 printf 和 scanf 函數的格式说明符,用于字符串参数。在 printf 中,它打印字符串;在 scanf 中,它从输入中读取字符串。 c语言中%s是...
    99+
    2024-05-12
    c语言
  • python自然语言处理之字典树知识总结
    一、什么是字典树 在自然语言处理中,字符串集合常用字典树存储,这是一种字符串上的树形数据结构。字典树中每条边都对应一个字,从根节点往下的路径构成一个个字符串。 字典树并不直接在节点上...
    99+
    2024-04-02
  • c语言中while是什么
    c语言的while循环结构用于在特定的条件满足时重复执行一段代码。它接收一个布尔条件作为参数,当条件为真时,将执行循环体并不断重新评估条件,直到条件为假,循环才会结束。 while:C...
    99+
    2024-05-12
    c语言
  • 什么是c语言的转义字符
    c语言转义字符是特殊字符,用于表示不可输入的字符或控制行为,以反斜杠开头,后跟附加字符。常见转义字符包括:1. \n:换行符;2. \t:制表符;3. \:反斜杠;4. \":双引号;5...
    99+
    2024-04-13
    c语言
  • C语言链式二叉树结构原理是什么
    这篇文章主要介绍“C语言链式二叉树结构原理是什么”,在日常操作中,相信很多人在C语言链式二叉树结构原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言链式二叉树结构原理是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-25
  • C语言中static关键字的作用是什么
    本篇内容介绍了“C语言中static关键字的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!static这个关键字是“静态”的意思,...
    99+
    2023-07-05
  • c语言中数字后加f是什么意思
    c语言中数字后加 "f" 表示该数字为浮点数,即小数或实数,用于表示更精细的数值,例如分数、百分比或科学常数,可以使用指数表示法或小数点表示法表示。 C语言中数字后加f的含义 在C语言...
    99+
    2024-05-10
    c语言
  • C语言近万字为你讲透树与二叉树
    目录一、树概念及结构1.1 树的概念1.2 树的相关概念1.3 树的表示二、二叉树概念及结构2.1 概念2.2 特殊的二叉树:2.3 二叉树的性质2.4 二叉树的存储结构1. 顺序存...
    99+
    2024-04-02
  • C++是什么语言
    这篇文章主要介绍“C++是什么语言”,在日常操作中,相信很多人在C++是什么语言问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++是什么语言”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!C++是一种面向...
    99+
    2023-06-17
  • c#是什么语言
    c# 是一种面向对象的高级跨平台编程语言,由 microsoft 开发,用于构建桌面、web、移动应用程序和游戏。它采用 c 风格的语法,支持 oop、自动垃圾回收和泛型等功能,并在 w...
    99+
    2024-04-04
    linux c++ macos c# 移动应用程序
  • c语言中?:是什么意思
    条件运算符(:)用于确定变量的值,根据布尔表达式条件返回不同值:condition为真时返回value_if_true,为假时返回value_if_false。 c语言中: 的含义 在...
    99+
    2024-04-13
    c语言
  • c语言中%-是什么意思
    c 语言中的 % 操作符用于计算两个整数值相除的余数。运算规则包括:正被除数正除数求余数、负被除数正除数余数为负、正被除数组负数求余数、负被除数负除数求余数加上负号。语法是:被除数 %-...
    99+
    2024-04-30
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作