Versuchen Sie die Implementierung in Python
- Versuchen Sie die Datenstruktur in Python
- Fügen Sie in Python einen String in einen Trie ein
- Suchen Sie ein Element in einem Trie in Python
- Versuchen Sie die Implementierung in Python
Versuche sind die Datenstrukturen, die wir zum Speichern von Zeichenfolgen verwenden. Sie ermöglichen es uns, Textzeichenfolgen so effizient wie möglich zu durchsuchen.
In diesem Artikel wird erläutert, wie wir einen Trie in Python implementieren können.
Versuchen Sie die Datenstruktur in Python
Sie können einen Trie als einen Baum betrachten, bei dem jeder Knoten aus einem Zeichen besteht. Jeder Knoten hat ein oder mehrere Kinder, je nachdem, ob es sich um ein internes Zeichen einer Zeichenfolge oder um das letzte Zeichen handelt.
Der Knoten, der das letzte Zeichen einer Zeichenfolge darstellt, hat kein Kind und markiert das Ende der Zeichenfolge. Wir werden eine Flag-Variable in die Klassendefinition aufnehmen, um das Ende einer Zeichenfolge zu markieren.
Jeder Knoten im Trie kann maximal 26 Kinder haben, wenn wir Strings speichern, die nur aus englischen Kleinbuchstaben bestehen. Wenn die Zeichenfolgen andere Zeichen als die Alphabete enthalten, ist die maximale Anzahl von Kindern eines bestimmten Knotens gleich der Gesamtzahl von unterschiedlichen Zeichen.
Sie können eine Node-Klasse in Python definieren, um einen Knoten eines Trie zu implementieren, wie im folgenden Beispiel gezeigt.
class Node:
def __init__(self):
self.children = []
for i in range(26):
self.children.append(None)
self.isLeafNode = False
Hier haben wir eine Liste mit dem Namen Kinder
erstellt, die verwendet wird, um zu definieren, ob ein Charakter ein Kind des aktuellen Knotens ist oder nicht. Da wir 26 Zeichen berücksichtigt haben, haben wir die Liste mit 26 None
-Werten initialisiert.
Wenn ein Zeichen kein Kind des aktuellen Knotens ist, enthält seine Position den Wert None
. Andernfalls speichert die diesem Zeichen entsprechende Position den Knoten für dieses Zeichen.
Beim Einfügen von Zeichen in die Liste Kinder
speichern wir die Kinderknoten in der alphabetischen Reihenfolge der Zeichen. Mit anderen Worten, der untergeordnete Knoten des Buchstabens a
wird bei Index 0 gespeichert, der untergeordnete Knoten des Buchstabens b
wird bei Index 1 gespeichert usw.
Nach dem Erstellen eines Knotens müssen wir eine Klasse erstellen, um einen Trie zu definieren. In der Klasse definieren wir einen leeren Knoten mit einer Liste, die 26 None
-Werte enthält, um die 26 Zeichen des englischen Alphabets darzustellen.
Wir nennen den leeren Knoten den Wurzel
-Knoten.
class Trie:
def __init__(self):
self.root = Node()
Immer wenn eine Zeichenfolge in den Trie eingefügt wird, wird der Knoten, der das erste Zeichen der Zeichenfolge darstellt, zum untergeordneten Knoten des Wurzel
-Knotens. Beachten Sie, dass wir die Knoten, die die nächsten Zeichen der Zeichenfolgen enthalten, entsprechend ihrer Position als Listenelemente speichern.
Nach dem Erstellen des root
-Knotens werden wir in den folgenden Abschnitten die Methoden implementieren, um ein Wort in den Trie einzufügen und nach einem Wort im Trie zu suchen.
Fügen Sie in Python einen String in einen Trie ein
Um ein Zeichen in den Trie einzufügen, ermitteln wir zunächst die Länge der einzufügenden Zeichenkette. Danach beginnen wir mit dem Crawlen des Trie vom root
-Knoten des Trie.
Das Folgende ist der Algorithmus zum Einfügen einer Zeichenfolge in den Trie:
- Berechnen Sie die Länge der Zeichenfolge, die in den Trie eingefügt werden soll. Speichern Sie es in einer Variablen
strLen
. - Nehmen Sie eine Variable
crawler
und weisen Sie der Variable denroot
-Knoten des Trie zu. - Wenn Sie sich auf Ebene
n
befinden, überprüfen Sie, ob das n-te Zeichen der Zeichenfolge auf dieser Ebene im Trie vorhanden ist. Wenn ja, speichere seine Position in der ListeKinder
in einer Variablenposition
; gehen Sie dann zu5
- andernfalls gehen Sie zu4
. - Erstelle einen neuen Knoten für den Trie und weise ihm den Index
position
desCrawlers
zu. - Bewegen Sie den
crawler
auf die nächste Ebene. - Überprüfen Sie, ob wir das Ende der Zeichenfolge erreicht haben; wenn ja, gehen Sie zu
7
- andernfalls gehen Sie zu3
. - Markieren Sie den aktuellen Knoten als Ende der Zeichenfolge.
Nachdem wir den Algorithmus besprochen haben, lassen Sie uns nun diesen Algorithmus implementieren, um eine Zeichenfolge in einen Trie in Python einzufügen.
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
Suchen Sie ein Element in einem Trie in Python
Um zu suchen, ob eine Zeichenfolge in einem Trie vorhanden ist oder nicht, verwenden wir den folgenden Algorithmus.
- Initialisieren Sie eine Variable
crawler
und weisen Sie der Variablen denroot
-Knoten des Trie zu. - Berechnen Sie die Länge des zu suchenden Strings im Trie. Speichern Sie es in einer Variablen
strLen
. - Finden Sie auf einer Ebene
n
heraus, ob das n-te Zeichen der Zeichenfolge in der ListeKinder
vorhanden ist. Wenn ja, gehen Sie zu4
; Andernfalls geben SieFalse
zurück. - Überprüfen Sie, ob der aktuelle Knoten ein Blattknoten ist. Wenn ja, gebe
True
zurück; andernfalls erhöhen Sien
und gehen Sie zu3
.
Wir haben den Algorithmus zum Suchen einer Zeichenfolge in einem Trie definiert. Lassen Sie uns es in Python implementieren.
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
Versuchen Sie die Implementierung in Python
Da wir die Methoden für Such- und Einfügeoperationen in einem Trie in Python implementiert haben, lassen Sie uns den Code anhand einiger Beispieloperationen ausführen.
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")
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 = "delftstack"
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("delftstack is present in the trie:", x.search("delftstack"))
print("python is present in the trie:", x.search("python"))
Ausgang:
Inserting the string: aditya
Inserting the string: delftstack
Inserting the string: aaditya
aditya is present in the trie: True
delftstack is present in the trie: True
python is present in the trie: False
Wir haben zuerst einen Trie in Python implementiert, indem wir die oben in diesem Beispiel besprochenen Algorithmen verwendet haben. Danach fügten wir drei Saiten, aditya
, delftstack
und aaditya
in den Trie ein.
Dann führten wir Suchoperationen auf dem Trie durch, um zu überprüfen, ob die Zeichenfolgen aditya
, delftstack
und python
im Trie vorhanden waren oder nicht. Sie können die Ausgabe im Beispiel beobachten.
Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.
GitHub