The Încercați structura de date este o structură de date arborescent utilizată pentru stocarea unui set dinamic de șiruri. Este folosit în mod obișnuit pentru eficient regăsire și depozitare de chei dintr-un set mare de date. Structura suportă operațiuni precum inserare , căutare , și stergere de chei, făcându-l un instrument valoros în domenii precum informatica și regăsirea informațiilor. În acest articol vom explora inserare și căutare operare în Trie Data Structure.

Încercați structura de date
Cuprins
- Reprezentarea lui Trie Node
- Reprezentarea nodului Trie:
A Încercați structura de date este format din noduri conectate prin muchii. Fiecare nod reprezintă un caracter sau o parte dintr-un șir. Nodul rădăcină, punctul de plecare al Trie, reprezintă un șir gol. Fiecare margine care emană dintr-un nod semnifică un caracter specific. Calea de la rădăcină la un nod reprezintă prefixul unui șir stocat în Trie.
O structură simplă pentru a reprezenta nodurile alfabetului englez poate fi următoarea.
linie nouă python
C++Javastruct TrieNode { // pointer array for child nodes of each node TrieNode* childNode[26]; // Used for indicating ending of string bool wordEnd; TrieNode() { // constructor // initialize the wordEnd variable with false // initialize every index of childNode array with // NULL wordEnd = false; for (int i = 0; i < 26; i++) { childNode[i] = NULL; } } };>public class TrieNode { // Array for child nodes of each node TrieNode[] childNode; // Used for indicating the end of a string boolean wordEnd; // Constructor public TrieNode() { // Initialize the wordEnd variable with false wordEnd = false; // Initialize every index of the childNode array with null childNode = new TrieNode[26]; for (int i = 0; i < 26; i++) { childNode[i] = null; } } }>Să parcurgem procesul de inserare a cuvintelor într-o structură de date Trie. Am acoperit deja elementele de bază ale Trie și structura nodurilor sale.
stivă în java
Iată o reprezentare vizuală a inserării cuvintelor și și pe într-o structură de date Trie:

Inserați operația în Trie Data Structure
Inserarea și în structura datelor Trie:
caseta de alertă javascript
- Începeți de la nodul rădăcină: Nodul rădăcină nu are niciun caracter asociat cu el și cu acesta sfârşitul cuvântului valoarea este 0 , indicând nicio sfârșit de cuvânt complet în acest moment.
- Primul caracter a: Calculați indicele folosind „ a’ – ‘a’ = 0 . Verificați dacă childNode[0] este nul . Din moment ce este, creați un nou TrieNode cu personajul A , sfârşitul cuvântului setat la 0 , și o matrice goală de pointeri. Deplasați-vă la acest nou nod.
- Al doilea caracter n: Calculați indicele folosind „n” – „a” = 13 . Verifica daca childNode[13] este nul . Este, așa că creați un nou TrieNode cu personajul n , sfârşitul cuvântului setat la 0 , și o matrice goală de pointeri. Deplasați-vă la acest nou nod.
- Al treilea caracter d: Calculați indicele folosind „ d’ – ‘a’ = 3 . Verifica daca childNode[3 ] este nul . Este, așa că creați un nou TrieNode cu personajul d , sfârşitul cuvântului setat la 1 (indicând cuvântul și se termină aici).
Inserarea furnicii în structura de date Trie:
- Începeți de la nodul rădăcină: Nodul rădăcină nu conține date, dar ține evidența fiecărui prim caracter din fiecare șir care a fost inserat.
- Primul caracter a: Calculați indicele folosind „ a’ – ‘a’ = 0 . Verificați dacă childNode[0] este nul . Avem deja A nod creat din inserția anterioară. deci trece la existent A nodul.
- Primul caracter n: Calculați indicele folosind „ n’ – ‘a’ = 13 . Verifica daca childNode [13] este nul . Nu este, așa că treceți la existent n nodul.
- Al doilea caracter t: Calculați indicele folosind „t” – „a” = 19 . Verifica daca childNode [19] este nul . Este, așa că creați un nou TrieNode cu personajul t , sfârşitul cuvântului setat la 1 (indicarea cuvântului furnică se termină aici).
Mai jos este implementarea inserării șirurilor în structura de date Trie:
C++#include using namespace std; struct TrieNode { // pointer array for child nodes of each node TrieNode* childNode[26]; // Used for indicating ending of string bool wordEnd; TrieNode() { // constructor // initialize the wordEnd variable with false // initialize every index of childNode array with // NULL wordEnd = false; for (int i = 0; i < 26; i++) { childNode[i] = NULL; } } }; void insert_key(TrieNode* root, string& key) { // Initialize the currentNode pointer // with the root node TrieNode* currentNode = root; // Iterate across the length of the string for (auto c : key) { // Check if the node exist for the current // character in the Trie. if (currentNode->childNode[c - 'a'] == NULL) { // Dacă nodul pentru caracterul curent nu există // atunci faceți un nou nod TrieNode* newNode = new TrieNode(); // Păstrați referința pentru noul // nou creat. currentNode->childNode[c - 'a'] = newNode; } // Acum, mutați indicatorul nodului curent la nodul nou // creat. currentNode = currentNode->childNode[c - 'a']; } // Incrementează wordEndCount pentru ultimul indicator // currentNode, ceea ce înseamnă că există un șir care se termină la // currentNode. currentNode->wordEnd = 1; }>>>Complexitatea timpului: O(număr de cuvinte * maxLengthOfWord)
Spațiu auxiliar: O(număr de cuvinte * maxLengthOfWord)Căutarea unei chei în structura de date Trie este similară cu operația de inserare. Cu toate acestea, numai compară personajele și se deplasează în jos . Căutarea se poate termina din cauza sfârșitului unui șir sau a lipsei cheii în încercare.
Abordare pas cu pas pentru căutarea în structura Trie Data:
- Începeți de la nodul rădăcină. Acesta este punctul de plecare pentru toate căutările din cadrul Trie.
- Traversați Trie pe baza caracterelor cuvântului pe care îl căutați. Pentru fiecare personaj, urmați ramura corespunzătoare din Trie. Dacă ramura nu există, cuvântul nu este prezent în Trie.
- Dacă ajungeți la sfârșitul cuvântului și indicatorul wordEnd este setat la 1, cuvântul a fost găsit.
- Dacă ajungeți la sfârșitul cuvântului și indicatorul wordEnd este 0, cuvântul nu este prezent în Trie, chiar dacă are un prefix cu un cuvânt existent.
Iată o reprezentare vizuală a cuvântului căutat tata în structura de date Trie:
Să presupunem că am inserat cu succes cuvintele și , pe , și tata în Trie-ul nostru și trebuie să căutăm cuvinte specifice în structura de date Trie. Să încercăm să căutăm cuvântul tata :
multiplexor doi la unul

Operațiune de căutare în Trie Data Structure
- Începem de la nodul rădăcină.
- Urmăm ramura corespunzătoare caracterului „d”.
- Urmăm ramura corespunzătoare caracterului a’.
- Urmăm ramura corespunzătoare caracterului „d”.
- Ajungem la sfârșitul cuvântului și sfârşitul cuvântului steag este 1 . Aceasta înseamnă că tata este prezent în Trie.
Mai jos este implementarea șirurilor de caractere în Trie Data Structure:
C++childNode[c - 'a']; } return (currentNode->wordEnd == true); }>>> Complexitatea timpului: O(număr de cuvinte * maxLengthOfWord)
Spațiu auxiliar: O(număr de cuvinte * maxLengthOfWord)întreg în șir java
Creați un nod rădăcină cu ajutorul lui TrieNode() constructor.
- Stocați o colecție de șiruri care trebuie inserate în trie într-un vector de șiruri, de exemplu, arr .
- Inserarea tuturor șirurilor în Trie cu ajutorul insert_key() funcţie,
- Căutați șiruri cu ajutorul lui cheie_căutare() funcţie.
Mai jos este implementarea abordării de mai sus:
C++ class TrieNode { TrieNode[] childNode; boolean wordEnd; TrieNode() { childNode = new TrieNode[26]; wordEnd = false; } } class Trie { TrieNode root; Trie() { root = new TrieNode(); } // Function to insert a key into the Trie void insert(String key) { TrieNode currentNode = root; for (int i = 0; i < key.length(); i++) { int index = key.charAt(i) - 'a'; if (currentNode.childNode[index] == null) { currentNode.childNode[index] = new TrieNode(); } currentNode = currentNode.childNode[index]; } currentNode.wordEnd = true; } // Function to search for a key in the Trie boolean search(String key) { TrieNode currentNode = root; for (int i = 0; i < key.length(); i++) { int index = key.charAt(i) - 'a'; if (currentNode.childNode[index] == null) { return false; } currentNode = currentNode.childNode[index]; } return currentNode.wordEnd; } } public class Main { public static void main(String[] args) { Trie trie = new Trie(); String[] inputStrings = { 'and', 'ant', 'do', 'geek', 'dad', 'ball' }; // Insert each string into the Trie for (String str : inputStrings) { trie.insert(str); } String[] searchQueryStrings = { 'do', 'geek', 'bat' }; // Search for each string and print whether it is // found in the Trie for (String query : searchQueryStrings) { System.out.println('Query String: ' + query); if (trie.search(query)) { System.out.println( 'The query string is present in the Trie'); } else { System.out.println( 'The query string is not present in the Trie'); } } } }> Piton class TrieNode: def __init__(self): self.childNode = [None] * 26 self.wordEnd = False class Trie: def __init__(self): self.root = TrieNode() # Function to insert a key into the Trie def insert(self, key): currentNode = self.root for char in key: index = ord(char) - ord('a') if not currentNode.childNode[index]: currentNode.childNode[index] = TrieNode() currentNode = currentNode.childNode[index] currentNode.wordEnd = True # Function to search for a key in the Trie def search(self, key): currentNode = self.root for char in key: index = ord(char) - ord('a') if not currentNode.childNode[index]: return False currentNode = currentNode.childNode[index] return currentNode.wordEnd if __name__ == '__main__': trie = Trie() inputStrings = ['and', 'ant', 'do', 'geek', 'dad', 'ball'] # Insert each string into the Trie for word in inputStrings: trie.insert(word) searchQueryStrings = ['do', 'geek', 'bat'] # Search for each string and print whether it is found in the Trie for query in searchQueryStrings: print('Query String:', query) if trie.search(query): print('The query string is present in the Trie') else: print('The query string is not present in the Trie')> JavaScript class TrieNode { constructor() { // Initialize the childNode array with 26 nulls this.childNode = Array(26).fill(null); // Initialize wordEnd to the false indicating that no word ends here yet this.wordEnd = false; } } class Trie { constructor() { // Initialize the root node of the Trie this.root = new TrieNode(); } // Function to insert a key into the Trie insert(key) { // Start from the root node let currentNode = this.root; for (let i = 0; i < key.length; i++) { const index = key.charCodeAt(i) - 'a'.charCodeAt(0); if (currentNode.childNode[index] === null) { currentNode.childNode[index] = new TrieNode(); } // Move to the next node in the Trie currentNode = currentNode.childNode[index]; } // Mark the end of the word currentNode.wordEnd = true; } // Function to search for a key in the Trie search(key) { // Start from the root node let currentNode = this.root; // Iterate through each character in the key for (let i = 0; i < key.length; i++) { const index = key.charCodeAt(i) - 'a'.charCodeAt(0); if (currentNode.childNode[index] === null) { return false; } // Move to the next node in the Trie currentNode = currentNode.childNode[index]; } // Return true if the end of the word is marked otherwise false return currentNode.wordEnd; } } // Driver code const trie = new Trie(); const inputStrings = ['and', 'ant', 'do', 'geek', 'dad', 'ball']; // Insert each string into the Trie inputStrings.forEach((str) =>trie.insert(str)); const searchQueryStrings = ['do', 'geek', 'bat']; // Căutați fiecare șir și imprimați dacă acesta este găsit în Trie searchQueryStrings.forEach((query) => { console.log(`Query String: ${query}`); if (trie.search(query)) { console.log('Șirul de interogare este prezent în Trie' } else { console.log('Șirul de interogare nu este prezent în Trie');>>>Ieșire
- Încercați Ștergeți
- Se afișează conținutul Trie
- Funcție de completare automată folosind Trie
- Căutarea modelelor folosind o încercare a tuturor sufixelor
- Pauza minimă de cuvânt
- Rânduri unice într-o matrice binară
- Număr de subșiruri distincte
- Word Boggle
- Sortarea matricei de șiruri (sau cuvinte) folosind Trie
Probleme de practică:

