Implement Tree (Prefix Tree)

Implement a tree with insertsearch, ja startsWith methods.

esimerkki:

Trie trie = new Trie();trie.insert("apple");
trie.search("apple"); // returns true
trie.search("app"); // returns false
trie.startsWith("app"); // returns true
trie.insert("app");
trie.search("app"); // returns true

Huom:

  • voidaan olettaa, että kaikki tulot koostuvat pienistä kirjaimista a-z.
  • kaikki tulot ovat taatusti ei-tyhjiä merkkijonoja.

tämä on leetcode-ongelma:

ratkaisu:

ennen kuin sukellamme tämän ongelman ratkaisemiseen, ymmärrämme ensin, mikä trien tietorakenne on lyhyesti.

Tree on järjestynyt puurakenne, jota käytetään lähinnä narujen säilyttämiseen. Syy siihen, että sitä käytetään merkkijonon tallentamiseen, on se, että sillä on nopea hakuaika. Merkkijonon löytämisen monimutkaisuus kolmikossa on O (m), jossa m on merkkijonon pituus. Jos olemme tallentaneet miljoona Jouset Tree ja meidän täytyy löytää tietty merkkijono, sanotaan kissa sitten sen monimutkaisuus on O (3), eikö se hämmästyttävä.

termi Tree tuli sanasta haku, sillä se tekee merkkijonon hakemisen merkkijonokokoelmasta erittäin helpoksi. Triestä käytetään myös nimitystä Etuliitepuu.

Triessä juuri on tyhjä ja jokaisessa lapsisolmussa on vain yksi merkki. Joten määrä lapsi solmut, tietyn solmun voi olla riippuu määrä aakkoset tietyllä kielellä. Oletetaan, että käytämme trie tallentaa Englanti sanoja, niin jokainen solmu on 26 lapsi solmut.

yllä olevassa kuvassa on esitetty vain 5 lapsen solmua, mutta varsinaisessa juuressa on 26 lapsen solmua, yksi kutakin aakkostoa kohti.

nyt, katsotaan, jos meidän täytyy edustaa muutamia merkkijonoja Tree tietorakenne sitten miten se näyttää. Oletetaan, että meidän pitää edustaa palloa, kaljua, autoa, kissaa ja koiraa triessä. Tämä näyttää alla. Alla olevassa kuvassa oranssit solmut tarkoittavat sanan loppua.

tämä oli johdatus siihen, mitä trie on, mutta pääosassa on se, miten trie voidaan toteuttaa. Katsomme, miten Trie voidaan toteuttaa alla.

jokaisen trien solmun tulee sisältää kaksi tietoa.

  1. Boolen lippu, joka kertoo, että tämä solmu on sanan loppu.
  2. joukon koko 26(riippuu käytetystä kielestä. 26 on englanniksi). Jokainen tämän taulukon indeksi osoittaa toiseen solmuun.

sanotaan, että jokaista kolmeuden solmua edustaa Trienodiluokka. Trienodiluokassa on kaksi kenttää:

  1. isEnd: Boolean field.
  2. lapsi: joukko tyyppiä Trienodi.

silloin meillä on Tree-Luokka, joka sisältää insertin, haun ja aloituksen menetelmällä.

katsotaan, miten insertti toimii Vaihe vaiheelta. Meidän täytyy lisätä kissa trieen.

  1. aluksi meillä on vain juurisolmu. Kaikki indeksit sen array sisältää null ja isEnd lippu on myös epätosi.

2. Valitsemme ensimmäisen merkin cat i. e c. nyt indeksi array on 2. Jos et ole tietoinen sitten löydämme indeksin tahansa aakkoset array tekemällä char – ’a’. Tekemällä tämän indeksi A on 0, b on 1, c on 2 ja niin edelleen. Menemme indeksi 2 array ja antaa sille uuden solmun.

3. Nyt siirrämme osoittimen toiseen solmuun. Toinen kirjaimisto cat on. joten alustamme indeksin 0 uuteen solmuun.

4. Siirrämme osoittimen seuraavaan solmuun. Seuraava kirjaimisto cat: ssa on t. T: n indeksi on 19. Alustamme indeksin 19 uuteen solmuun.

5. Siirrymme seuraavaan solmuun . Nyt aakkosia ei ole enää jäljellä. Joten merkitsemme tämän solmun päätteeksi.

alla on insert-menetelmän Java-koodi.

public void insert(String str) {
char data = str.toCharArray();
TrieNode tempNode = root;
for (char c : data) {
int index = c - 'a';
if (tempNode.child == null) {
tempNode.child = new TrieNode();
}
tempNode = tempNode.child;
}
tempNode.isEnd = true;
}

alla on täydellinen Java-ratkaisu tähän ohjelmaan haku-ja startsWith-menetelmällä.

class Trie {
class TrieNode {
static final int ALPHABET_SIZE = 26;
TrieNode child = new TrieNode; boolean isEnd;
}
TrieNode root;
/**
* Initialize your data structure here.
*/
public Trie() {
root = new TrieNode();
}
/**
* Inserts a word into the trie.
*/
public void insert(String str) {
char data = str.toCharArray();
TrieNode tempNode = root;
for (char c : data) {
int index = c - 'a';
if (tempNode.child == null) {
tempNode.child = new TrieNode();
}
tempNode = tempNode.child;
}
tempNode.isEnd = true;
}
/**
* Returns if the word is in the trie.
*/
public boolean search(String str) {
char data = str.toCharArray();
TrieNode tempNode = root;
for (char c : data) {
int index = c - 'a';
if (tempNode.child == null) {
return false;
}
tempNode = tempNode.child;
}
if (tempNode != null && tempNode.isEnd == false) {
return false;
}
return true;
}
/**
* Returns if there is any word in the trie that starts with the given prefix.
*/
public boolean startsWith(String str) {
char data = str.toCharArray();
TrieNode tempNode = root;
for (char c : data) {
int index = c - 'a';
if (tempNode.child == null) {
return false;
}
tempNode = tempNode.child;
}
return true;
}
}

Vastaa

Sähköpostiosoitettasi ei julkaista.