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语言下快速排序(挖坑法)详解

    C语言下快速排序(挖坑法)详解 什么是快速排序 快速排序是将一个待排序的序列分成两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再对这两部分分别进行排序,递归执行该操作直到将整个序列排好为止。快速排序使用了分治思想。由于在每一次的递归过程中,都将待排序的序列分成两部分,因此处理的数据量不断减少,使得算法的效率比较高。 快速排序的实现 挖坑法 挖坑法…

    算法与数据结构 2023年5月19日
    00
  • java ArrayList按照同一属性进行分组

    要按照同一属性进行分组,我们需要用到Java中的Collections类和Comparator接口。 首先,我们需要为ArrayList中的对象定义一个属性,以便按照该属性进行分组。例如,我们定义一个Person类,其中包含name和age两个属性,我们想要按照年龄进行分组。则代码如下: public class Person { private Strin…

    算法与数据结构 2023年5月19日
    00
  • MySQL order by与group by查询优化实现详解

    MySQL的order by与group by是常用的查询优化手段,本篇攻略将详细讲解order by与group by的使用方法及其优化实现。 1. MySQL Order By MySQL Order By 用于对查询结果进行排序,将查询结果按照指定字段的顺序进行排列 ,默认升序排序,也可以指定为降序排序。 SELECT column1, column2…

    算法与数据结构 2023年5月19日
    00
  • JS深入学习之数组对象排序操作示例

    《JS深入学习之数组对象排序操作示例》是一篇介绍JavaScript数组排序相关操作的文章,主要包含以下内容: 1. 数组对象排序 1.1 sort()方法 sort()方法是JavaScript中的一个数组排序方法,可以用于对数组的元素进行排序。sort()方法可以接收一个可选的排序函数作为参数,通过这个函数,我们可以实现自定义的排序规则。 语法为:arr…

    算法与数据结构 2023年5月19日
    00
  • Javascript实现快速排序(Quicksort)的算法详解

    Javascript实现快速排序的算法详解 在这个攻略中,我们将通过Javascript实现快速排序算法,并讲解算法的详细过程。 快速排序的基本思想 快速排序是一种基于交换的排序算法,其基本思想是通过选择一个基准元素,在一趟排序过程中,将之前需要排序的序列中的元素分割成两个部分,其中,左边部分元素的值都小于基准元素的值,右边部分元素的值都大于基准元素的值,然…

    算法与数据结构 2023年5月19日
    00
  • PHP两种快速排序算法实例

    下面是对PHP两种快速排序算法实例的详细讲解: 1. 快速排序算法介绍 快速排序属于交换排序的一种,是目前应用最广泛的排序算法之一,也是学习算法的重要内容。快速排序算法的基本思想是通过将待排序序列进行划分,并不断递归对子序列进行排序,完成整个序列的排序。 快速排序的基本步骤如下: 选择一个基准值(pivot)。 将待排序数组中小于基准值的元素移动到数组左侧,…

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

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

    算法与数据结构 2023年5月19日
    00
  • java简单冒泡排序实例解析

    Java简单冒泡排序是一种常见的排序算法,它通过不断比较相邻元素的大小,并交换相邻元素的位置,从而将最大(最小)的元素逐渐交换到序列的顶端(底端),实现排序操作。在本篇文章中,我们将详细讲解如何使用Java实现简单的冒泡排序算法。 算法实现思路 定义一个整型数组,包含待排序的元素 使用for循环嵌套,通过不断比较相邻的元素大小,将最大(最小)元素逐渐移到数组…

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