Python 中的 Trie 实现
尝试是我们用来存储字符串的数据结构。 它们使我们能够以最有效的方式搜索文本字符串。
本文将讨论如何在 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。 否则,与该字符对应的位置存储该字符的节点。
在将字符插入子列表时,我们按字符的字母顺序存储子节点。 换句话说,字母a的子节点将存储在索引0处,字母b的子节点将存储在索引1处,依此类推。
创建完节点后,我们需要创建一个类来定义Trie。 在类中,我们将定义一个空节点,其中包含一个包含 26 个 None 值的列表,以表示英语字母表的 26 个字符。
我们将空节点称为根节点。
class Trie:
def __init__(self):
self.root = Node()
每当将字符串插入到 Trie 中时,表示字符串第一个字符的节点就会成为根节点的子节点。 请注意,我们将根据其位置将包含字符串的下一个字符的节点存储为列表元素。
创建根节点后,我们将在下面的章节中实现在 Trie 中插入单词和在 Trie 中搜索单词的方法。
在 Python 中将字符串插入 Trie 树中
为了向 Trie 中插入一个字符,我们首先要找到要插入的字符串的长度。 之后,我们将从Trie的根节点开始爬取Trie。
下面是向 Trie 中插入字符串的算法:
- 计算要插入到 Trie 中的字符串的长度。 将其存储在变量 strLen 中。
- 采取一个变量爬虫并将Trie的根节点分配给变量。
- 如果位于 n 层,请检查字符串的第 n 个字符是否存在于 Trie 中的该层。 如果是,则将其在子列表中的位置存储在变量position中; 然后,转到5 - 否则,转到4。
- 为Trie创建一个新节点,并将其分配给爬虫的索引位置。
- 将履带式移动到下一个级别。
- 检查我们是否到达了字符串的末尾; 是,执行7,否则执行3。
- 将当前节点标记为字符串的结尾。
讨论完算法后,现在让我们实现这个算法,在 Python 中将字符串插入到 Trie 中。
def insert(self, input_str):
strLen = len(input_str)
crawler = self.root
for level in range(strLen):
character = input_str[level]
position = ord(character) - ord('a')
if crawler.children[position] is None:
crawler.children[position] = Node()
crawler = crawler.children[position]
crawler.isLeafNode = True
在 Python 中搜索 Trie 中的元素
为了搜索字符串是否存在于 Trie 中,我们将使用以下算法。
- 初始化一个变量爬虫,并将Trie的根节点赋给变量。
- 计算Trie中要搜索的字符串的长度。 将其存储在变量 strLen 中。
- 在第 n 层,查找子列表中是否存在字符串的第 n 个字符。 是,执行4; 否则,返回 False。
- 检查当前节点是否为叶子节点。 如果是,则返回True; 否则,增加 n 并转到 3。
我们已经定义了在 Trie 中搜索字符串的算法。 让我们用 Python 来实现它。
def search(self, input_str):
crawler = self.root
strLen = len(input_str)
for level in range(strLen):
character = input_str[level]
position = ord(character) - ord('a')
if crawler.children[position] is None:
return False
crawler = crawler.children[position]
return crawler.isLeafNode
Python 中的 Trie 实现
由于我们已经在 Python 中实现了 Trie 中的搜索和插入操作方法,因此让我们使用一些示例操作来执行代码。
class Node:
def __init__(self):
self.children = []
for i in range(26):
self.children.append(None)
self.isLeafNode = False
class Trie:
def __init__(self):
self.root = Node()
def insert(self, input_str):
strLen = len(input_str)
crawler = self.roothave
for level in range(strLen):
character = input_str[level]
position = ord(character) - ord('a')
if crawler.children[position] is None:
crawler.children[position] = Node()
crawler = crawler.children[position]
crawler.isLeafNode = True
def search(self, input_str):
crawler = self.root
strLen = len(input_str)
for level in range(strLen):
character = input_str[level]
position = ord(character) - ord('a')have
if crawler.children[position] is None:
return False
crawler = crawler.children[position]
return crawler.isLeafNode
x = Trie()
myStr = "aditya"
print("Inserting the string:", myStr)
x.insert(myStr)
myStr = "jiyik"
print("Inserting the string:", myStr)
x.insert(myStr)
myStr = "aaditya"
print("Inserting the string:", myStr)
x.insert(myStr)
print("aditya is present in the trie:", x.search("aditya"))
print("jiyik is present in the trie:", x.search("jiyik"))
print("python is present in the trie:", x.search("python"))
输出:
Inserting the string: aditya
Inserting the string: jiyik
Inserting the string: aaditya
aditya is present in the trie: True
jiyik is present in the trie: True
python is present in the trie: False
我们首先使用上面本示例中讨论的算法在 Python 中实现了 Trie。 之后,我们将三个字符串aditya、jiyik 和 aaditya 插入到Trie中。
然后,我们对 Trie 执行搜索操作,检查 Trie 中是否存在字符串 aditya、jiyik 和 python。 您可以观察示例中的输出。
相关文章
Python Apriori 算法
发布时间:2023/06/30 浏览次数:184 分类:Python
-
Apriori 算法指出,如果一个项集是频繁的,那么它的所有非空子集也必须是频繁的。 本篇文章展示了如何使用 Python 中的 apyori 模块逻辑来实现这一点。
在 Python 中创建键盘记录器
发布时间:2023/06/30 浏览次数:189 分类:Python
-
在Python中,我们可以读取用户输入并检测键盘和鼠标等硬件设备来开发交互式应用程序。 特别是,pynput 模块允许我们使用此类设备并使用函数检测按键和光标移动。本篇文章将介绍如何在 Py
检查Python中的变量是否为字符串
发布时间:2023/06/30 浏览次数:138 分类:Python
-
我们将通过示例介绍两种不同的方法来检查 Python 中的变量是否为字符串。检查Python中的变量是否为字符串 在 Python 中,每个变量都有一个数据类型。 数据类型表示变量内部存储的数据类型。
在 Python 中安装 YAML
发布时间:2023/06/30 浏览次数:122 分类:Python
-
我们将介绍 Python 中的 YAML。 我们还将介绍如何在不同设备上安装 YAML。Python 中的 YAML YAML 是一种序列化语言。
下载 Python 中的 Anaconda
发布时间:2023/06/30 浏览次数:60 分类:Python
-
本文将介绍 Anaconda 以及我们可以在 Python 中下载的不同版本。Python 中的 Anaconda Anaconda 是 Python 科学数据的来源。
使用 Python 截屏
发布时间:2023/06/30 浏览次数:169 分类:Python
-
本文将引导您完成使用 Python 截取屏幕截图必须遵循的所有步骤。 让我们开始!使用 Pyautogui 模块使用 Python 进行屏幕截图第一种方法使用 Python 提供的 pyauotgui 模块。
在 Python 中绘制水平线
发布时间:2023/06/30 浏览次数:157 分类:Python
-
我们将介绍如何在Python中创建一条水平线。 我们还将介绍 Python 中的 Matplotlib 库。Python 中的水平线 水平线是从左到右或从右到左的任何直线。
使用 Python 连接到 PostgreSQL 数据库
发布时间:2023/06/30 浏览次数:134 分类:Python
-
本文介绍了创建与 PostgreSQL 上的数据库的连接的过程。 我们需要安装 PostgreSQL 和创建数据库等先决条件,如下所述。在系统中安装 PostgreSQL
Python 中的 Rabin-Karp 算法
发布时间:2023/06/30 浏览次数:154 分类:Python
-
我们将介绍 Python 中的 Rabin-Karp 算法,并讨论如何在 Python 程序中使用它。Python 中的 Rabin-Karp 算法 Rabin-Karp 算法从给定的输入或值中查找特定的数字、字母或模式。