The Kokeile tietorakennetta on puumainen tietorakenne, jota käytetään dynaamisen merkkijonojoukon tallentamiseen. Sitä käytetään yleisesti tehokkaaseen käyttöön haku ja varastointi avaimia suuressa tietojoukossa. Rakenne tukee toimintoja mm lisäys , Hae , ja poisto avaimia, mikä tekee siitä arvokkaan työkalun tietotekniikan ja tiedonhaun kaltaisilla aloilla. Tässä artikkelissa aiomme tutkia lisäys ja haku käyttö Trie Data Structuressa.

Kokeile tietorakennetta
Sisällysluettelo
- Trie Noden esitys
- Trie Noden esitys:
A Kokeile tietorakennetta koostuu reunoilla yhdistetyistä solmuista. Jokainen solmu edustaa merkkiä tai merkkijonon osaa. Juurisolmu, Trien aloituspiste, edustaa tyhjää merkkijonoa. Jokainen solmusta lähtevä reuna merkitsee tiettyä merkkiä. Polku juuresta solmuun edustaa Trieen tallennetun merkkijonon etuliitettä.
Yksinkertainen rakenne englannin aakkosten solmujen edustamiseksi voi olla seuraava.
Näyttelijä Rekha
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; } } }>Käydään läpi sanojen lisääminen Trie-tietorakenteeseen. Olemme jo käsitelleet Trien perusteet ja sen solmurakenteen.
c#-kytkin
Tässä on visuaalinen esitys sanojen lisäämisestä ja ja päällä Trie-tietorakenteeseen:

Lisää toiminto Trie-tietorakenteeseen
Lisääminen ja Trie-tietorakenne:
javascript-merkkijonon leikkaus
- Aloita juurisolmusta: Juurisolmulla ei ole siihen ja siihen liittyvää merkkiä sanan loppu arvo on 0 , joka osoittaa, että tässä vaiheessa ei ole täydellistä sanan loppua.
- Ensimmäinen merkki a: Laske indeksi käyttämällä ' a’ – ‘a’ = 0 . Tarkista, onko lapsisolmu[0] On tyhjä . Koska se on, luo uusi TrieNode merkillä a , sanan loppu asetettu 0 , ja tyhjä osoittimien joukko. Siirry tähän uuteen solmuun.
- Toinen merkki n: Laske indeksi käyttämällä 'n' - 'a' = 13 . Tarkista jos lapsisolmu[13] On tyhjä . Se on, joten luo uusi TrieNode hahmolla n , sanan loppu asetettu 0 , ja tyhjä osoittimien joukko. Siirry tähän uuteen solmuun.
- Kolmas merkki d: Laske indeksi käyttämällä ' d' – 'a' = 3 . Tarkista jos lapsisolmu[3 ] On tyhjä . Se on, joten luo uusi TrieNode hahmolla d , sanan loppu asetettu 1 (ilmaisee sanan ja päättyy tähän).
Muurahaisen lisääminen Trie-tietorakenteeseen:
- Aloita juurisolmusta: Juurisolmu ei sisällä mitään tietoja, mutta se seuraa jokaisen lisätyn merkkijonon jokaista ensimmäistä merkkiä.
- Ensimmäinen merkki a: Laske indeksi käyttämällä ' a’ – ‘a’ = 0 . Tarkista, onko lapsisolmu[0] On tyhjä . Meillä on jo a solmu, joka on luotu edellisestä lisäyksestä. joten siirry olemassa olevaan a solmu.
- Ensimmäinen merkki n: Laske indeksi käyttämällä ' n' – 'a' = 13 . Tarkista jos lapsisolmu [13] on tyhjä . Ei ole, joten siirry olemassa olevaan n solmu.
- Toinen merkki t: Laske indeksi käyttämällä 't' - 'a' = 19 . Tarkista jos lapsisolmu [19] on tyhjä . Se on, joten luo uusi TrieNode hahmolla t , sanan loppu asetettu 1 (ilmaisee, että sana muurahainen päättyy tähän).
Alla on merkkijonojen lisäämisen toteutus Trie-tietorakenteessa:
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->lapsiSolmu[c - 'a'] == NULL) { // Jos nykyisen merkin solmua ei ole olemassa // tee uusi solmu TrieNode* newNode = new TrieNode(); // Säilytä äskettäin luodun // solmun viite. currentNode->childSolmu[c - 'a'] = uusiSolmu; } // Siirrä nyt nykyisen solmun osoitin juuri // luotuun solmuun. nykyinenSolmu = nykyinenSolmu->lapsisolmu[c - 'a']; } // Kasvata viimeisen currentNode //-osoittimen wordEndCount-arvoa, mikä tarkoittaa, että merkkijono päättyy // currentNode. currentNode->wordEnd = 1; }>Aika monimutkaisuus: O(sanojen määrä * maxLengthOfWord)
Aputila: O(sanojen määrä * maxLengthOfWord)Avaimen etsiminen Trie-tietorakenteessa on samanlainen kuin sen lisäystoiminto. Kuitenkin se vain vertaa hahmoja ja siirtyy alaspäin . Haku voi päättyä merkkijonon päättymisen tai avaimen puutteen vuoksi triessä.
Vaiheittainen lähestymistapa etsimiseen Trie Data -rakenteessa:
- Aloita juurisolmusta. Tämä on kaikkien Trien sisäisten hakujen lähtökohta.
- Kulje Trie etsimäsi sanan merkkien perusteella. Seuraa kunkin merkin vastaavaa haaraa Triessä. Jos haaraa ei ole olemassa, sanaa ei ole Triessä.
- Jos saavutat sanan loppuun ja sanaEnd-lipun arvoksi on asetettu 1, sana on löydetty.
- Jos saavutat sanan loppuun ja sanaEnd-lippu on 0, sanaa ei ole Triessä, vaikka sillä on yhteinen etuliite olemassa olevan sanan kanssa.
Tässä on visuaalinen esitys hakusanasta isä Trie-tietorakenteessa:
java versio linux
Oletetaan, että olemme lisänneet sanat onnistuneesti ja , päällä , ja isä Trie-tietorakenteeseen, ja meidän on etsittävä tiettyjä sanoja Trie-tietorakenteesta. Yritetään etsiä sanaa isä :

Hakutoiminto Trie-tietorakenteessa
- Aloitamme juurisolmusta.
- Seuraamme haaraa, joka vastaa merkkiä 'd'.
- Seuraamme merkkiä a' vastaavaa haaraa.
- Seuraamme haaraa, joka vastaa merkkiä 'd'.
- Saavumme sanan loppuun ja sanan loppu lippu on 1 . Se tarkoittaa, että isä on läsnä Triessä.
Alla on hakumerkkijonojen toteutus Trie Data Structuressa:
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; } } }; bool search_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->lapsisolmu[c - 'a'] == NULL) { // Annettua sanaa ei ole Trie:ssä return false; } // Siirrä currentNode-osoitin jo olemassa olevaan // nykyisen merkin solmuun. nykyinenSolmu = nykyinenSolmu->lapsisolmu[c - 'a']; } return (currentNode->wordEnd == true); }>Aika monimutkaisuus: O(sanojen määrä * maxLengthOfWord)
Aputila: O(sanojen määrä * maxLengthOfWord)kokonaisluku merkkijonoon java
Luo juurisolmu avulla TrieNode() rakentaja.
- Tallenna kokoelma merkkijonoja, jotka on lisättävä trieen merkkijonovektoriin, sanotaan: arr .
- Kaikkien merkkijonojen lisääminen Trieen avulla insert_key() toiminto,
- Etsi merkkijonoja avulla search_key() toiminto.
Alla on yllä olevan lähestymistavan toteutus:
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->lapsiSolmu[c - 'a'] == NULL) { // Jos nykyisen merkin solmua ei ole olemassa // tee uusi solmu TrieNode* newNode = new TrieNode(); // Säilytä äskettäin luodun // solmun viite. currentNode->childSolmu[c - 'a'] = uusiSolmu; } // Siirrä nyt nykyisen solmun osoitin juuri // luotuun solmuun. nykyinenSolmu = nykyinenSolmu->lapsisolmu[c - 'a']; } // Kasvata viimeisen currentNode //-osoittimen wordEndCount-arvoa, mikä tarkoittaa, että merkkijono päättyy // currentNode. currentNode->wordEnd = 1; } bool search_key(TrieNode* root, string& key) { // Alusta currentNode-osoitin // juurisolmulla TrieNode* currentNode = root; // Iteroi merkkijonon pituudelta (auto c : -näppäin) { // Tarkista, onko nykyiselle //-merkille solmu Trie:ssä. if (currentNode->childSolmu[c - 'a'] == NULL) { // Annettua sanaa ei ole Triessä return false; } // Siirrä currentNode-osoitin jo olemassa olevaan // nykyisen merkin solmuun. nykyinenSolmu = nykyinenSolmu->lapsisolmu[c - 'a']; } return (currentNode->wordEnd == true); } // Ohjainkoodi int main() { // Tee juurisolmu Trie TrieNodelle* root = new TrieNode(); // Tallentaa merkkijonot, jotka haluamme lisätä // Trie-vektoriininputStrings = { 'ja', 'muurahainen', 'tee', 'nörtti', 'isä', 'pallo' }; // lisäysoperaatioiden määrä Trie:ssä int n = inputStrings.size(); for (int i = 0; i< n; i++) { insert_key(root, inputStrings[i]); } // Stores the strings that we want to search in the Trie vectorsearchQueryStrings = { 'do', 'geek', 'bat' }; // hakutoimintojen määrä Trie int searchQueries = searchQueryStrings.size(); for (int i = 0; i< searchQueries; i++) { cout << 'Query String: ' << searchQueryStrings[i] << '
'; if (search_key(root, searchQueryStrings[i])) { // the queryString is present in the Trie cout << 'The query string is present in the ' 'Trie
'; } else { // the queryString is not present in the Trie cout << 'The query string is not present in ' 'the Trie
'; } } return 0; }> Java 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'); } } } }> Python 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']; // Etsi jokainen merkkijono ja tulosta löytyykö se kentästä Trie searchQueryStrings.forEach((query) => { console.log(`Query String: ${query}`); if (trie.search(query)) { console.log('Kyselymerkkijono on Triessä');>>
Lähtö Aiheeseen liittyvät artikkelit: - Yritä poistaa
- Näytetään Trien sisältö
- Automaattinen täydennys -ominaisuus Trien avulla
- Kuviohaku kaikkien päätteiden triellä
Harjoitusongelmat:
- Minimi sanakatko
- Yksilölliset rivit binäärimatriisissa
- Erillisten osamerkkijonojen määrä
- Sana sekaisin
- Merkkijonojen (tai sanojen) lajittelu Trien avulla

