字典树的基本知识及使用C语言的相关实现

yizhihongxing

字典树的基本知识

字典树,英文名为Trie树,又称单词查找树或键树,是一种树形数据结构,用于表示关联数组或映射。它的优点是,可以大大减少无谓的字符串比较,查询效率比哈希表高。

字典树的核心概念是节点,每个节点包含一个字符和指向子节点的指针。根节点为空字符,每个字符串以一个独立的路径插入节点。如果一个字符串是另一个字符串的前缀,那么这个字符串的节点是另一个字符串节点的祖先节点。字典树的实现有多种,我们接下来主要介绍C语言实现。

C语言实现

字典树的结构体

typedef struct Trie {
    int isEnd;
    struct Trie* next[26];
} Trie;

上述代码中的Trie结构体包含一个布尔类型的isEnd成员和26个指向子节点的指针。如果isEnd为1,则当前字符串存在于字典树中。

字典树的插入操作

Trie* trieCreate() {
    Trie* node = (Trie*)malloc(sizeof(Trie));
    memset(node, 0, sizeof(Trie));
    return node;
}

void trieInsert(Trie* obj, char* word) {
    while (*word) {
        if (!obj->next[*word - 'a'])
            obj->next[*word - 'a'] = trieCreate();
        obj = obj->next[*word++ - 'a'];
    }
    obj->isEnd = 1;
}

上述代码中的trieCreate()函数负责创建一个新节点。trieInsert()函数负责插入一个新字符串到字典树中。具体做法是遍历字符串,若下一个字符对应的节点不存在,则创建一个新节点。最后将当前节点的isEnd成员设置为1,表示该字符串已插入到字典树中。

字典树的查询操作

bool trieSearch(Trie* obj, char* word) {
    while (*word) {
        if (!obj->next[*word - 'a'])
            return false;
        obj = obj->next[*word++ - 'a'];
    }
    return obj->isEnd;
}

上述代码中的trieSearch()函数负责查询一个字符串是否存在于字典树中。具体做法是遍历字符串,判断下一个字符对应的节点是否存在。如果节点不存在,则字符串不存在于字典树中;如果遍历完成后当前节点的isEnd成员为1,则表示字符串存在于字典树中。

示例演示

接下来我们用两个示例分别演示字典树的使用。

示例一

int main() {
    Trie* trie = trieCreate();
    trieInsert(trie, "apple");
    printf("%d\n", trieSearch(trie, "apple"));   // 1
    printf("%d\n", trieSearch(trie, "app"));     // 0
    printf("%d\n", trieSearch(trie, "applf"));   // 0
    trieInsert(trie, "app");
    printf("%d\n", trieSearch(trie, "app"));     // 1
    return 0;
}

上述代码中,我们首先创建一个新的字典树。然后插入一个单词"apple"。接下来进行多次查询,分别查询"apple""app""applf"是否存在于字典树中,结果分别是1、0、0。最后插入一个新单词"app",再次查询"app"是否存在于字典树中,结果为1。

示例二

int main() {
    Trie* trie = trieCreate();
    trieInsert(trie, "cat");
    trieInsert(trie, "dog");
    trieInsert(trie, "car");
    trieInsert(trie, "card");
    printf("%d\n", trieSearch(trie, "cat"));    // 1
    printf("%d\n", trieSearch(trie, "cards"));  // 0
    printf("%d\n", trieSearch(trie, "car"));    // 1
    return 0;
}

上述代码中,我们创建一个新的字典树,并插入4个字符串。接下来进行多次查询,分别查询"cat""cards""car"是否存在于字典树中,结果分别是1、0、1。

至此,我们完成了字典树的基本知识及使用C语言的相关实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:字典树的基本知识及使用C语言的相关实现 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java数据结构之链表、栈、队列、树的实现方法示例

    Java数据结构之链表、栈、队列、树的实现方法示例 链表 链表是一种线性数据结构,由节点的集合构成。每个节点包含两部分,数据部分和指针部分。数据部分用于存储数据,指针部分用于指向下一个节点。 单向链表示例 public class LinkedList<E>{ private Node<E> head; private int siz…

    数据结构 2023年5月17日
    00
  • C++实现LeetCode(211.添加和查找单词-数据结构设计)

    首先,我们需要先了解一下题目的要求和限制,以及具体的解题思路。 题目描述 设计一个支持添加、删除、查找单词的数据结构。添加和删除单词的操作需要支持普通词和通配符’.’。查找单词只支持普通词,不支持通配符’.’。所有单词都是非空的。 解题思路 这道题可以使用前缀树(Trie树)来实现。 首先,我们需要定义一个单词类,它包含两个字段:单词字符串和单词长度。然后,…

    数据结构 2023年5月17日
    00
  • 四边形不等式学习笔记

    简要题意 四边形不等式是一种 dp 优化策略。多用于 2D DP。 内容 对于区间 \([l,r]\) 带来的贡献 \(w(l,r)\),如果其满足: 对于 \(L\leq l\leq r \leq R\),\(w(L,r)+w(l,R)\leq w(L,R)+w(l,r)\) 则称 \(w\) 满足四边形不等式。特别地,如果上式符号取等,则称其满足四边形恒…

    算法与数据结构 2023年4月17日
    00
  • 腾讯2018秋招正式笔试题目小结

    腾讯2018秋招正式笔试题目小结 背景介绍 腾讯作为中国科技领域的佼佼者,每年都会举行大规模的招聘,吸引着众多优秀的应聘者前来。其中,笔试是选拔过程中的重要环节,也是一个入职的关键。本文旨在对腾讯2018秋招正式笔试的题目进行详细的分析和总结,帮助广大应聘者更好地进行准备。 题目类型 腾讯2018秋招正式笔试共分为两个部分:编程题和客观题。编程题主要考察应聘…

    数据结构 2023年5月17日
    00
  • C++实现数据结构的顺序表详解

    C++实现数据结构的顺序表详解 介绍 在进行程序开发时,常常需要对数据进行存储和操作。其中一种数据结构是顺序表,它提供了一种在内存中线性存储数据的方法,能够方便地对数据进行插入、删除、查找等操作。本文将详细介绍如何使用C++实现数据结构的顺序表,帮助读者掌握顺序表的创建、插入、删除、查找等操作。 创建顺序表 顺序表可以使用数组来实现。下面的代码展示了如何创建…

    数据结构 2023年5月17日
    00
  • Java深入了解数据结构之哈希表篇

    Java深入了解数据结构之哈希表篇 1. 哈希表的定义 哈希表(Hash Table),也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(Hash Function)。 哈希表是基于哈希函数实现的,哈希函数将关键字映射到哈希表中的位置,如果存在两个…

    数据结构 2023年5月17日
    00
  • Go 数据结构之堆排序示例详解

    Go 数据结构之堆排序示例详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构,它满足下列性质: 堆中每个节点的关键字都不大于(或不小于)其子节点的关键字。 堆中,根节点(顶端)是最小或最大元素。 堆实际上是一个完全二叉树,因此可以用数组实现。对于下标为i的节点,其左子节点为2i,右子节点为2i+1,父节点为i/2。 堆分为最大堆和最小堆。在最大堆中,父…

    数据结构 2023年5月17日
    00
  • Java数据结构之队列(动力节点Java学院整理)

    Java数据结构之队列(动力节点Java学院整理) 队列是一种有序列表,在其中所有插入操作必须在后端进行,而所有的删除操作必须在前端进行的数据结构。这种结构有时被称为先进先出(FIFO)。 队列的分类 普通队列:队列和栈一样,都是只能在一端进行插入操作,在另一端进行删除操作的特殊线性表。队列的特点是:先进先出。适用于数据必须按照插入顺序处理的必要场合。 双端…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部