Skip to content

Latest commit

 

History

History
57 lines (48 loc) · 3.88 KB

Trie树原理.md

File metadata and controls

57 lines (48 loc) · 3.88 KB

Trie树,也称为前缀树或字典树,是一种用于存储和检索字符串集合的树形数据结构。它利用字符串的公共前缀来节省存储空间和加速查询操作。下面我将详细介绍Trie树的原理。

Trie树的基本概念

  1. 节点(Node):
    • Trie树由一个根节点和多个子节点组成。
    • 每个节点表示一个字符,从根节点到某一节点的路径表示一个字符串的前缀。
    • 节点通常包含一个字符、一个布尔标志(表示是否为字符串的结尾)和多个子节点指针。
  2. 边(Edge):
    • Trie树中的边表示字符之间的关系。
    • 每条边连接一个父节点和一个子节点,表示从父节点到子节点的字符。
    • 边的数量取决于字符集的大小,通常使用数组或哈希表来存储子节点指针。
  3. 字符串插入(String Insertion):
    • 将一个字符串插入到Trie树中时,从根节点开始,沿着字符串的字符逐个遍历。
    • 如果当前字符在当前节点的子节点中不存在,则创建一个新的子节点。
    • 重复以上步骤,直到字符串的所有字符都插入到Trie树中。
    • 在字符串的最后一个字符对应的节点上,将布尔标志设置为true,表示该字符串存在于Trie树中。
  4. 字符串查询(String Query):
    • 查询一个字符串是否存在于Trie树中时,从根节点开始,沿着字符串的字符逐个遍历。
    • 如果在某个节点上无法找到对应的子节点,则说明该字符串不存在于Trie树中。
    • 如果成功遍历完字符串的所有字符,并且最后一个字符对应的节点的布尔标志为true,则说明该字符串存在于Trie树中。

Trie树的工作原理

  1. 插入字符串:
    • 从根节点开始,依次处理字符串的每个字符。
    • 对于当前字符,检查当前节点是否有对应的子节点:
      • 如果有,则移动到该子节点,继续处理下一个字符。
      • 如果没有,则创建一个新的子节点,将当前字符作为该节点的字符,然后移动到新创建的子节点。
    • 重复以上步骤,直到字符串的所有字符都处理完毕。
    • 在最后一个字符对应的节点上,将布尔标志设置为true,表示该字符串存在于Trie树中。
  2. 查询字符串:
    • 从根节点开始,依次处理字符串的每个字符。
    • 对于当前字符,检查当前节点是否有对应的子节点:
      • 如果有,则移动到该子节点,继续处理下一个字符。
      • 如果没有,则说明该字符串不存在于Trie树中,返回false。
    • 如果成功遍历完字符串的所有字符,检查最后一个字符对应的节点的布尔标志:
      • 如果为true,则说明该字符串存在于Trie树中,返回true。
      • 如果为false,则说明该字符串是某个字符串的前缀,但本身不存在于Trie树中,返回false。
  3. 查找前缀:
    • Trie树还支持查找以给定字符串为前缀的所有字符串。
    • 从根节点开始,沿着给定字符串的字符遍历Trie树,直到无法继续遍历或到达字符串的末尾。
    • 从当前节点开始,通过深度优先搜索或广度优先搜索遍历所有子节点,收集以当前节点为前缀的所有字符串。

Trie树的优缺点

优点:

  1. 查询效率高:Trie树的查询时间复杂度与字符串的长度成正比,与字符串的数量无关。
  2. 前缀查询:Trie树支持高效地查找以给定字符串为前缀的所有字符串。
  3. 节省空间:Trie树利用字符串的公共前缀来减少重复存储,节省了空间。

缺点:

  1. 空间占用:尽管Trie树节省了重复存储的空间,但是由于需要存储大量的节点和边,空间占用仍然较大。
  2. 插入和删除操作:在Trie树中插入和删除字符串可能需要创建或删除多个节点,操作相对复杂。
  3. 字符集大小:Trie树的空间复杂度与字符集的大小有关,对于大字符集(如Unicode)的情况,空间占用会更加显著。