Trie树_字典树(字符串排序)简介及实现

接下来我将详细讲解“Trie树_字典树(字符串排序)简介及实现”的完整攻略。

什么是 Trie 树?

Trie 树,也叫字典树,是一种树形数据结构,用于处理字符串匹配、排序等问题。它的特点是能够快速地查找特定前缀或后缀的字符串。

Trie 树的基本实现

Trie 树通常是一棵多叉树,其中根节点不包含任何字符,每个子节点包含一个字符,组成一个完整的字符串。下面是一个简单的 Trie 树实现的示例代码:

class TrieNode:
    def __init__(self):
        self.children = [None] * 26
        self.is_end_of_word = False

class Trie:
    def __init__(self):
        self.root = TrieNode()

    def _char_to_index(self, ch):
        return ord(ch) - ord('a')

    def insert(self, word: str) -> None:
        node = self.root

        for ch in word:
            index = self._char_to_index(ch)
            if not node.children[index]:
                node.children[index] = TrieNode()
            node = node.children[index]

        node.is_end_of_word = True

    def search(self, word: str) -> bool:
        node = self.root

        for ch in word:
            index = self._char_to_index(ch)
            if not node.children[index]:
                return False
            node = node.children[index]

        return node.is_end_of_word

    def starts_with(self, prefix: str) -> bool:
        node = self.root

        for ch in prefix:
            index = self._char_to_index(ch)
            if not node.children[index]:
                return False
            node = node.children[index]

        return True

其中,TrieNode 类表示 Trie 树的节点,具有 childrenis_end_of_word 两个属性。children 表示当前节点的子节点,由于字符集大小为 26,因此每个节点有 26 个子节点;is_end_of_word 表示当前节点所代表的字符串是否是一个单词的结尾。

Trie 类则表示 Trie 树本身,具有 root 属性。insert() 方法用于向 Trie 树中添加一个字符串;search() 方法用于查找一个字符串是否存在;starts_with() 方法用于查找是否存在以某个字符串为前缀的字符串。

Trie 树的应用

1.字符串匹配

Trie 树的一大应用是字符串匹配,可以快速地判断一个字符串是否包含另一个字符串。比如,我们可以用 Trie 树来实现敏感词过滤。

下面是一个简单的敏感词过滤的例子:

words = ["北京", "程序员", "公务员", "领导", "牛逼", "你妈"]

def is_contain_sensitive_word(sentence):
    trie = Trie()

    for word in words:
        trie.insert(word)

    for i in range(len(sentence)):
        j = i
        node = trie.root

        while j < len(sentence) and node.children[ord(sentence[j]) - ord('a')]:
            node = node.children[ord(sentence[j]) - ord('a')]
            j += 1

            if node.is_end_of_word:
                return True

    return False

该函数使用 Trie 树实现敏感词过滤。首先将所有敏感词添加到 Trie 树中,然后从字符串的第一个字符开始,依次检查每个字符能否与 Trie 树中的某个单词匹配,如果能够匹配,说明该字符串中包含敏感词。

2.字符串排序

Trie 树还可以用于字符串的排序。字符串排序是一种常见问题,可以通过建立 Trie 树来实现。

下面是一个简单的字符串排序的例子:

words = ["abc", "ab", "bcd", "cd", "a", "defg"]

class TrieNode:
    def __init__(self):
        self.children = [None] * 26
        self.is_end_of_word = False
        self.words = []

class Trie:
    def __init__(self):
        self.root = TrieNode()

    def _char_to_index(self, ch):
        return ord(ch) - ord('a')

    def insert(self, word: str) -> None:
        node = self.root

        for ch in word:
            index = self._char_to_index(ch)
            if not node.children[index]:
                node.children[index] = TrieNode()
            node = node.children[index]
            node.words.append(word)

        node.is_end_of_word = True

    def get_all_words(self):
        def dfs(node):
            if not node:
                return []
            res = []
            if node.is_end_of_word:
                res += node.words
            for child in node.children:
                if not child:
                    continue
                res += dfs(child)
            return res

        return dfs(self.root)

trie = Trie()

for word in words:
    trie.insert(word)

print(trie.get_all_words())

在 Trie 树上,每个节点都存储了当前路径上的所有字符串,依次递归 Trie 树,最后得到的即是排好序的字符串列表。

以上为 Trie 树的基本实现和应用,希望你能从中学到一些有用的知识。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Trie树_字典树(字符串排序)简介及实现 - Python技术站

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

相关文章

  • C语言 冒泡排序算法详解及实例

    冒泡排序算法详解及实例 什么是冒泡排序算法 冒泡排序是一种很基础的排序算法,它通过从序列的一端开始,依次比较相邻两个元素的大小,如果它们的顺序不对,就交换它们的位置,直到把整个序列排序完成。冒泡排序算法的时间复杂度为O(n^2),所以它并不适合排序规模很大的序列。 冒泡排序算法的实现 冒泡排序算法的实现很简单,其核心代码如下: void bubble_sor…

    算法与数据结构 2023年5月19日
    00
  • JavaScript算法学习之冒泡排序和选择排序

    JavaScript算法学习之冒泡排序和选择排序 冒泡排序和选择排序是常见的两种排序算法。在本文中,我们将详细讲解这两种排序算法,并提供代码示例供读者参考。 冒泡排序 冒泡排序是一种简单的排序算法,它通过比较相邻两个元素的大小,依次将最大的元素冒泡到数组的末尾。 以下是冒泡排序的代码示例: function bubbleSort(array) { const…

    算法与数据结构 2023年5月19日
    00
  • JS实现的合并两个有序链表算法示例

    下面为您详细讲解JS实现的合并两个有序链表算法示例的完整攻略。 什么是合并两个有序链表? 合并两个有序链表,顾名思义就是将两个有序链表合并成一个有序链表。具体实现过程是将链表A和链表B按照顺序依次比较,将较小的节点插入到一个新的链表C中,直至A、B中有一个链表被遍历结束,另一个链表中剩余的节点则直接插入到链表C的最后。 示例如下: 链表A 链表B 合并后的链…

    算法与数据结构 2023年5月19日
    00
  • JS中的算法与数据结构之字典(Dictionary)实例详解

    下面我将详细讲解“JS中的算法与数据结构之字典(Dictionary)实例详解”的完整攻略。 什么是字典? 字典是一种存储唯一键和对应值的数据结构,每个键对应一个值。JavaScript 中的对象就是字典的一种实现,通过键值对来存储和访问数据。 字典的操作 字典支持以下几种操作: 添加键值对 删除键值对 查找键值对 获取所有键 获取所有值 字典的实现 下面是…

    算法与数据结构 2023年5月19日
    00
  • C#几种排序算法

    下面是关于“C#几种排序算法”的详细攻略: C#几种排序算法 概述 排序算法是程序员必须掌握的基本算法之一。在实际应用中,选择合适的排序算法可以显著提高程序的执行效率。这里介绍几种经典的排序算法,并提供相应的C#代码实现。 排序算法简介 冒泡排序 冒泡排序是一种基础的排序算法,思路是将相邻的两个元素进行比较,将较大的元素交换到后面。具体过程是从第一个元素开始…

    算法与数据结构 2023年5月19日
    00
  • C#实现的二维数组排序算法示例

    接下来我将为大家详细讲解“C#实现的二维数组排序算法示例”的完整攻略。 什么是二维数组排序算法? 二维数组是一种常见的数据结构,是一个表格状(行列)的数组。而排序算法则是把一组无序的数据按照规定的排序方式进行排列的算法。二维数组排序算法是在二维数组基础上进行排序操作的算法。 C#实现二维数组排序算法示例 下面我们来看看如何用C#实现二维数组排序算法的示例: …

    算法与数据结构 2023年5月19日
    00
  • C++中的几种排序算法

    下面就C++中几种常用的排序算法进行详细的讲解。 一、冒泡排序 冒泡排序是一种基本排序算法,也是入门级别的排序算法。其基本思想就是对于一组待排序的数据,通过不断地比较相邻两个元素的大小关系,并对需要调整位置的元素进行交换,来达到排序的目的。 C++代码实现: void bubble_sort(int arr[], int n) { for (int i = …

    算法与数据结构 2023年5月19日
    00
  • JavaScript数据结构与算法之二叉树添加/删除节点操作示例

    首先让我们来介绍一下“JavaScript数据结构与算法之二叉树添加/删除节点操作示例”这个主题。 主题介绍 本主题主要介绍了在 JavaScript 中对于二叉树数据结构进行添加/删除节点操作的示例代码。二叉树是一种常见的树形结构,在计算机科学领域中被广泛应用。节点的添加与删除是该数据结构中常见的操作之一,本主题将通过示例代码,为您详细介绍操作的过程。 代…

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