Tries是我们用来存储字符串的数据结构。它们允许我们以最有效的方式搜索文本字符串。
本文将讨论我们如何在Python中实现一个Trie。
Python中的Trie数据结构
你可以把Trie看作一棵树,每个节点由一个字符组成。每个节点都有一个或多个子节点,这取决于它是一个字符串的内部字符还是最后一个字符。
代表字符串最后一个字符的节点没有子节点,它标志着字符串的结束。我们将在类的定义中加入一个标志变量来标记字符串的结束。
如果我们存储只由小写英文字母组成的字符串,那么Trie中的每个节点最多可以有26个子节点。如果字符串有字母以外的字符,那么某个节点的最大子节点数就等于不同字符的总数。
你可以在 Python 中定义一个 Node 类来实现 Trie 的一个节点,如下面的例子所示。
class Node:
def __init__(self):
self.children = []
for i in range(26):
self.children.append(None)
self.isLeafNode = False
在这里,我们创建了一个名为children 的列表,用来定义一个字符是否是当前节点的子节点。由于我们考虑了26个字符,我们用26个None 的值初始化了这个列表。
如果一个字符不是当前节点的孩子,它的位置将包含值None 。否则,与该字符相对应的位置将存储该字符的节点。
在向children 列表中插入字符时,我们按照字符的字母顺序存储子节点。换句话说,字母a 的子节点将被存储在索引0,字母b 的子节点将被存储在索引1,等等。
在创建一个节点之后,我们需要创建一个类来定义一个Trie。在这个类中,我们将定义一个空节点,其列表中包含26个None ,代表英文字母的26个字符。
我们将称这个空节点为root 节点。
class Trie:
def __init__(self):
self.root = Node()
每当一个字符串被插入到Trie中,代表该字符串第一个字符的节点就会成为root 节点的子节点。请注意,我们将把包含字符串下一个字符的节点按照其位置作为列表元素来存储。
在创建了root 节点后,我们将在下面的章节中实现在三联体中插入一个词和在三联体中搜索一个词的方法。
在Python中的Trie中插入一个字符串
为了在Trie中插入一个字符,我们将首先找到要插入的字符串的长度。之后,我们将从三联体的root 节点开始爬行三联体。
以下是向Trie中插入字符串的算法:
- 计算要插入到Trie中的字符串的长度。将其存储在一个变量strLen 。
- 取一个变量crawler ,并将三联体的root 节点分配给该变量。
- 如果你在n ,检查字符串的第n个字符是否存在于Trie中的那一层。如果是,将其在children 列表中的位置存储到变量position ;然后,转到5 – 否则,转到4 。
- 为Trie创建一个新的节点,并将其分配给crawler 的索引position 。
- 将crawler 移到下一级。
- 检查我们是否已经到达了字符串的末端;如果是,转到7 – 否则,转到3 。
- 将当前节点标记为字符串的结尾。
在讨论了这个算法之后,现在让我们在Python中实现这个算法,将一个字符串插入到一个Trie中。
def insert(self, input_str)
1405



被折叠的 条评论
为什么被折叠?



