trie data structure

Post on 25-May-2015

434 Views

Category:

Engineering

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

It Is About Trie Data Structure

TRANSCRIPT

DATA STRUCTURE

TRIE

Name: Mahadi Hassan

ID: 1320133042

&

Name: Mahmud Rahman Parag

ID: 1320900042

What Is TRIE?

Trie Is An Efficient Information Retrieval Data Structure Also Called Digital Tree And Sometimes Radix Tree Or Prefix Tree (As They Can Be Searched By Prefixes), Is An Ordered Tree Data Structure That Is Used To Store A Dynamic Set Or Associative Array Where The Keys Are Usually Strings.

Why Trie Data Structure?

• Searching trees in general favor keys which are of fixed

size since this leads to efficient storage management.

• However in case of applications which are retrieval

based and which call for keys varying length, tries

provide better options.

• Tries are also called as Lexicographic Search trees.

• The name trie (pronounced as “try”)originated from the

word “retrieval”.

TYPES OF TRIE

1.Standard Tries

2.Compressed Tries

3.Suffix Tries

STANDARD TRIE

The Standard Trie For A Set Of Strings S Is An Ordered Tree Such That:

Each Node Labeled With A Character (Without Root).

The Children Of A Node Are Alphabetically Ordered.

The Paths From The External Nodes To The Root Yield The Strings Of S

EXAMPLE:

Standard Trie For A Set Of Strings S

S = { bear, bell, bid, bull, buy, sell, stock, stop }

TIME COMPLEXITY

A Standard Trie Uses O(n) Space. Operations (find, insert, remove) Take Time

O(dm) Each, Where:

n = Total Size Of The Strings In S,

m = Size Of The String Parameter Of The Operation

d = Alphabet Size

TRIE SPECIFICATION

Operations:

addWord

Function Adds word to an .

Postcondition Trie is not full

searchWord

Function Search a word in the trie

Postcondition Returns true if the world is found and false otherwise.

deleteWord

Function Delete a word in the trie

Postcondition Trie is not empty

TRIE SPECIFICATION

Operations:

print

Function Print the word in the trie

Postcondition Trie either maybe full or not

NODE STRUCTURE

Class Node

{

public:

char value;

bool end;

Node *children[26];

}

The Character Value (A – Z) / (a – z).

Indicates Whether This Node Completes A Word

Represents The 26 Letters In The Alphabet

NODE STRUCTURE

char value

bool end

0 1 2 3 4 5 6 7 8 9 10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

Character Data

Boolean Data

A Node Type Pointer Array

\0

INSERTION

INSERTION ALGORITHMInsert: Apple

First Create A Root That Has Empty String And Every Single Pointer Array Must Point To The NULL (Default). And Boolean Value Of Every Node Must Be false By Default.

false

0 … 10 … 2

0 … 26

NULL

INSERTION ALGORITHMInsert: Apple

Root

INSERTION ALGORITHMInsert: Apple

Second Convert All Of The String’s Character To Uppercase Or To Lowercase.

char currentChar = tolower(word.at(i));

INSERTION ALGORITHMInsert: Apple

Second Convert All Of The String’s Character To Uppercase Or To Lowercase.

char currentChar = tolower(word.at(i));

Here, Suppose string s = “Apple” And Length Of String Is 5 So……….

INSERTION ALGORITHMInsert: Apple

Second Convert All Of The String’s Character To Uppercase Or To Lowercase.

char currentChar = tolower(word.at(i));

Here, Suppose string s = “Apple” And Length Of String Is 5 So……….

s[0] = A, s[1] = p, s[2] = p, s[3] = l, s[4] = e

INSERTION ALGORITHMInsert: Apple

Second Convert All Of The String’s Character To Uppercase Or To Lowercase.

char currentChar = tolower(word.at(i));

A p p l e

0 1 2 3 4

Here, Suppose string s = “Apple” And Length Of String Is 5 So……….

s[0] = A, s[1] = p, s[2] = p, s[3] = l, s[4] = e

INSERTION ALGORITHMInsert: Apple

A p p l e

0 1 2 3 4

INSERTION ALGORITHMInsert: Apple

A p p l e

0 1 2 3 4

char currentChar = tolower(word.at(0));

currentChar a

INSERTION ALGORITHMInsert: Apple

Then Get The Correct Index For The Appropriate Character

int index = currentChar - 'a';

So……….

currentChar a

int index = currentChar - 'a'; int index = a - 'a';

int index = 0;

INSERTION ALGORITHMInsert: Apple

Declare A Pointer Node Type Pointer Variable That Point To The Root

Node *currentNode = root;

RootcurrentNodePointing To

INSERTION ALGORITHMInsert: Apple

Root

currentNode

INSERTION ALGORITHMInsert: Apple

if (currentNode->children[0] != NULL)

{

currentNode = currentNode->children[0];

}

false

0 … 10 … 2

0 … 26

NULL

If 0 Pointing To The NULL?

Check If The Current Node Has The Current Character As One Of Its Descendants

INSERTION ALGORITHMInsert: Apple

if (currentNode->children[0] != NULL)

{

currentNode = currentNode->children[0];

}

Is 0 Pointing To The NULL?

YES!

So IF Statement Won’t Execute…………

And The Current Node Doesn't have the current character as one of its descendants

Here 0 Is The Index Value ( a – ‘a’ )

Check If The Current Node Has The Current Character As One Of Its Descendants

false

0 … 10 … 2

0 … 26

NULL

INSERTION ALGORITHMInsert: Apple

else

{

Node *newNode = new Node(currentChar);

currentNode->children[0] = newNode;

currentNode = newNode;

}

So………. Node Constructor

INSERTION ALGORITHMInsert: Apple

Node *newNode = new Node(currentChar);

So……….

currentChar a

Node(currentChar)

INSERTION ALGORITHMInsert: Apple

Node *newNode = new Node(currentChar);

So……….

currentChar a

aNode(currentChar)

INSERTION ALGORITHMInsert: Apple

Node *newNode = new Node(currentChar);

So……….

currentChar a

aNode(currentChar)

anewNodeAll 26 Children Of newNode Will Point To The NULL

INSERTION ALGORITHMInsert: Apple

currentNode->children[0] = newNode;

So……….

anewNode RootcurrentNode

0

INSERTION ALGORITHMInsert: Apple

currentNode->children[0] = newNode;

So……….

a

newNode Root0

currentNode

INSERTION ALGORITHMInsert: Apple

currentNode = newNode;

So……….

a

newNode Root0

currentNode

INSERTION ALGORITHMInsert: Apple

if (i == word.size() - 1)

{

currentNode->end = true;

}

Now Check If It Is The Last Character Of The Word Has Been Reached

0 == 4? NO Won’t Execute

INSERTION ALGORITHMInsert: Apple

So……….

a

newNode Root0

currentNode

bool end will be false

INSERTION ALGORITHMInsert: Apple

Root0

acurrentNode

INSERTION ALGORITHMInsert: Apple

A p p l e

0 1 2 3 4

char currentChar = tolower(word.at(1));

currentChar p

INSERTION ALGORITHMInsert: Apple

Then Get The Correct Index For The Appropriate Character

int index = currentChar - 'a';

So……….

currentChar p

int index = currentChar - 'a'; int index = p - 'a';

int index = 15;

INSERTION ALGORITHMInsert: Apple

if (currentNode->children[15] != NULL)

{

currentNode = currentNode->children[15];

}

afalse

15 … 1

0 … 20 … 2

6

NULL

If 15 Pointing To The NULL?

Check If The Current Node Has The Current Character As One Of Its Descendants

INSERTION ALGORITHMInsert: Apple

if (currentNode->children[15] != NULL)

{

currentNode = currentNode->children[15];

}

Check If The Current Node Has The Current Character As One Of Its Descendants

afalse

15 … 1

0 … 20 … 2

6

Is 15 Pointing To The NULL?

YES!

So IF Statement Won’t Execute…………

And The Current Node Doesn't have the current character as one of its descendants

Here 15 Is The Index Value ( p – ‘a’ )

NULL

INSERTION ALGORITHMInsert: Apple

else

{

Node *newNode = new Node(currentChar);

currentNode->children[15] = newNode;

currentNode = newNode;

}

So………. Node Constructor

INSERTION ALGORITHMInsert: Apple

Node *newNode = new Node(currentChar);

So……….

currentChar p

Node(currentChar)

INSERTION ALGORITHMInsert: Apple

Node *newNode = new Node(currentChar);

So……….

currentChar p

pNode(currentChar)

INSERTION ALGORITHMInsert: Apple

Node *newNode = new Node(currentChar);

So……….

currentChar p

pNode(currentChar)

pnewNodeAll 26 Children Of newNode Will Point To The NULL

INSERTION ALGORITHMInsert: Apple

currentNode->children[15] = newNode;

So……….

pnewNode acurrentNode

15

INSERTION ALGORITHMInsert: Apple

currentNode->children[15] = newNode;

So……….

p

newNode a15

currentNode

INSERTION ALGORITHMInsert: Apple

currentNode = newNode;

So……….

p

newNode a15

currentNode

INSERTION ALGORITHMInsert: Apple

if (i == word.size() - 1)

{

currentNode->end = true;

}

Now Check If It Is The Last Character Of The Word Has Been Reached

1 == 4? NO Won’t Execute

INSERTION ALGORITHMInsert: Apple

So……….

p

newNode a15

currentNode

bool end will be false

INSERTION ALGORITHMInsert: Apple

Root0

a15

p

currentNode

INSERTION ALGORITHMInsert: Apple

SIMILARLY

INSERTION ALGORITHMInsert: Apple

Root0

a15

p15

p

INSERTION ALGORITHMInsert: Apple

Root0

a15

p15

p11

l

INSERTION ALGORITHMInsert: Apple

Root0

a15

p15

p11

l4

e

INSERTION ALGORITHMInsert: Apple

if (i == word.size() - 1)

{

currentNode->end = true;

}

Now Check If It Is The Last Character Of The Word Has Been Reached

4 == 4? YES Will Execute

INSERTION ALGORITHMInsert: Apple

Root0

a15

p15

p11

l4

e

bool end will be True

INSERTION ALGORITHM

Now Insert: Army

INSERTION ALGORITHMInsert: Army

A r m y

0 1 2 3

INSERTION ALGORITHMInsert: Army

A r m y

0 1 2 3

char currentChar = tolower(word.at(0));

currentChar a

INSERTION ALGORITHMInsert: Army

Then Get The Correct Index For The Appropriate Character

int index = currentChar - 'a';

So……….

currentChar a

int index = currentChar - 'a'; int index = a - 'a';

int index = 0;

INSERTION ALGORITHMInsert: Army

Declare A Pointer Node Type Pointer Variable That Point To The Root

Node *currentNode = root;

RootcurrentNodePointing To

DELETE ALGORITHMDelete: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

currentNode

INSERTION ALGORITHMInsert: Army

if (currentNode->children[0] != NULL)

{

currentNode = currentNode->children[0];

}

false

0 … 10 … 2

0 … 26

NULL

If 0 Pointing To The NULL?

Check If The Current Node Has The Current Character As One Of Its Descendants

INSERTION ALGORITHMInsert: Army

if (currentNode->children[0] != NULL)

{

currentNode = currentNode->children[0];

}

Is 0 Pointing To The NULL?

NO!

So IF Statement Will Execute…………

Here 0 Is The Index Value ( a – ‘a’ )

Check If The Current Node Has The Current Character As One Of Its Descendants

false

0 … 10 … 2

0 … 26

NULL

INSERTION ALGORITHMInsert: Army

currentNode = currentNode->children[0];

So……….

INSERTION ALGORITHMInsert: Army

Root0

a15

p15

p11

l4

e

currentNode

bool end will be True

INSERTION ALGORITHMInsert: Army

if (i == word.size() - 1)

{

currentNode->end = true;

}

Now Check If It Is The Last Character Of The Word Has Been Reached

0 == 3? NO Won’t Execute

INSERTION ALGORITHMInsert: Army

A r m y

0 1 2 3

char currentChar = tolower(word.at(1));

currentChar r

INSERTION ALGORITHMInsert: Army

Then Get The Correct Index For The Appropriate Character

int index = currentChar - 'a';

So……….

currentChar r

int index = currentChar - 'a'; int index = r - 'a';

int index = 17;

INSERTION ALGORITHMInsert: Army

if (currentNode->children[17] != NULL)

{

currentNode = currentNode->children[17];

}

afalse

17 … 1

0 … 20 … 2

6

NULL

If 15 Pointing To The NULL?

Check If The Current Node Has The Current Character As One Of Its Descendants

INSERTION ALGORITHMInsert: Army

if (currentNode->children[17] != NULL)

{

currentNode = currentNode->children[17];

}

Check If The Current Node Has The Current Character As One Of Its Descendants

afalse

17 … 1

0 … 20 … 2

6

Is 17 Pointing To The NULL?

YES!

So IF Statement Won’t Execute…………

And The Current Node Doesn't have the current character as one of its descendants

Here 17 Is The Index Value ( r – ‘a’ )

NULL

INSERTION ALGORITHMInsert: Army

else

{

Node *newNode = new Node(currentChar);

currentNode->children[17] = newNode;

currentNode = newNode;

}

So………. Node Constructor

INSERTION ALGORITHMInsert: Army

Node *newNode = new Node(currentChar);

So……….

currentChar r

Node(currentChar)

INSERTION ALGORITHMInsert: Army

Node *newNode = new Node(currentChar);

So……….

currentChar r

rNode(currentChar)

INSERTION ALGORITHMInsert: Army

Node *newNode = new Node(currentChar);

So……….

currentChar r

rNode(currentChar)

rnewNodeAll 26 Children Of newNode Will Point To The NULL

INSERTION ALGORITHMInsert: Army

currentNode->children[17] = newNode;

So……….

INSERTION ALGORITHMInsert: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r

currentNode

INSERTION ALGORITHMInsert: Army

currentNode = newNode;

So……….

INSERTION ALGORITHMInsert: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r

currentNode

INSERTION ALGORITHMInsert: Army

if (i == word.size() - 1)

{

currentNode->end = true;

}

Now Check If It Is The Last Character Of The Word Has Been Reached

1 == 3? NO Won’t Execute

INSERTION ALGORITHMInsert: Army

SIMILARLY

INSERTION ALGORITHMInsert: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

INSERTION ALGORITHMInsert: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

INSERTION ALGORITHMInsert: Army

if (i == word.size() - 1)

{

currentNode->end = true;

}

Now Check If It Is The Last Character Of The Word Has Been Reached

3 == 3? YES Will Execute

INSERTION ALGORITHMInsert: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

DELETION

DELETION ALGORITHMDelete: Army

A r m y

0 1 2 3

char currentChar = tolower(word.at(0));

currentChar a

DELETION ALGORITHMDelete: Army

Then Get The Correct Index For The Appropriate Character

int index = currentChar - 'a';

So……….

currentChar a

int index = currentChar - 'a'; int index = a - 'a';

int index = 0;

DELETION ALGORITHMDelete: Army

Declare A Pointer Node Type Pointer Variable That Point To The Root

Node *currentNode = root;

RootcurrentNodePointing To

DELETION ALGORITHMDelete: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

currentNode

DELETION ALGORITHMDelete: Army

if (currentNode->children[0] != NULL)

{

currentNode = currentNode->children[0];

}

false

0 … 10 … 2

0 … 26

NULL

If 0 Pointing To The NULL?

Check If The Current Node Has The Current Character As One Of Its Descendants

DELETION ALGORITHMDelete: Army

if (currentNode->children[0] != NULL)

{

currentNode = currentNode->children[0];

}

Is 0 Pointing To The NULL?

NO!

So IF Statement Will Execute…………

Here 0 Is The Index Value ( a – ‘a’ )

Check If The Current Node Has The Current Character As One Of Its Descendants

false

0 … 10 … 2

0 … 26

NULL

DELETION ALGORITHMDelete: Army

currentNode = currentNode->children[0];

So……….

DELETION ALGORITHMDelete: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

currentNode

DELETION ALGORITHMDelete: Army

A r m y

0 1 2 3

char currentChar = tolower(word.at(1));

currentChar r

DELETION ALGORITHMDelete: Army

Then Get The Correct Index For The Appropriate Character

int index = currentChar - 'a';

So……….

currentChar r

int index = currentChar - 'a'; int index = r - 'a';

int index = 17;

DELETION ALGORITHMDelete: Army

if (currentNode->children[17] != NULL)

{

currentNode = currentNode->children[17];

}

afalse

17 … 1

0 … 20 … 2

6

NULL

If 15 Pointing To The NULL?

Check If The Current Node Has The Current Character As One Of Its Descendants

DELETION ALGORITHMDelete: Army

if (currentNode->children[17] != NULL)

{

currentNode = currentNode->children[17];

}

Check If The Current Node Has The Current Character As One Of Its Descendants

afalse

17 … 1

0 … 20 … 2

6

Is 17 Pointing To The NULL?

NO!

So IF Statement Will Execute…………

Here 17 Is The Index Value ( r – ‘a’ )

NULL

DELETION ALGORITHMDelete: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

currentNode

DELETION ALGORITHMDelete: Army

SIMILARLY

DELETION ALGORITHMDelete: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

currentNode

DELETION ALGORITHMDelete: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

currentNode

DELETION ALGORITHMDelete: Army

if (i == word.size() – 1 && currentNode->end)

{

currentNode->end = false;

}

Now Check If It Is The Last Character Of The Word Has Been Reached

3 == 3? && currentNode end? YES Will Execute

DELETION ALGORITHMDelete: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

ybool end will be False So Word Couldn’t Be Found By Search So The Word Is Deleted.

SEARCH

SEARCHING ALGORITHMSearch: Army

A r m y

0 1 2 3

char currentChar = tolower(word.at(0));

currentChar a

SEARCHING ALGORITHMSEARCH: Army

Then Get The Correct Index For The Appropriate Character

int index = currentChar - 'a';

So……….

currentChar a

int index = currentChar - 'a'; int index = a - 'a';

int index = 0;

SEARCHING ALGORITHMSearch: Army

Declare A Pointer Node Type Pointer Variable That Point To The Root

Node *currentNode = root;

RootcurrentNodePointing To

SEARCHING ALGORITHMSearch: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

currentNode

SEARCHING ALGORITHMSearch: Army

if (currentNode->children[0] != NULL)

{

currentNode = currentNode->children[0];

}

false

0 … 10 … 2

0 … 26

NULL

If 0 Pointing To The NULL?

Check If The Current Node Has The Current Character As One Of Its Descendants

SEARCHING ALGORITHMSearch: Army

if (currentNode->children[0] != NULL)

{

currentNode = currentNode->children[0];

}

Is 0 Pointing To The NULL?

NO!

So IF Statement Will Execute…………

Here 0 Is The Index Value ( a – ‘a’ )

Check If The Current Node Has The Current Character As One Of Its Descendants

false

0 … 10 … 2

0 … 26

NULL

SEARCHING ALGORITHMSearch: Army

currentNode = currentNode->children[0];

So……….

SEARCHING ALGORITHMSearch: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

currentNode

SEARCHING ALGORITHMSearch: Army

A r m y

0 1 2 3

char currentChar = tolower(word.at(1));

currentChar r

SEARCHING ALGORITHMSearch: Army

Then Get The Correct Index For The Appropriate Character

int index = currentChar - 'a';

So……….

currentChar r

int index = currentChar - 'a'; int index = r - 'a';

int index = 17;

SEARCHING ALGORITHMSearch: Army

if (currentNode->children[17] != NULL)

{

currentNode = currentNode->children[17];

}

afalse

17 … 1

0 … 20 … 2

6

NULL

If 15 Pointing To The NULL?

Check If The Current Node Has The Current Character As One Of Its Descendants

SEARCHING ALGORITHMSearch: Army

if (currentNode->children[17] != NULL)

{

currentNode = currentNode->children[17];

}

Check If The Current Node Has The Current Character As One Of Its Descendants

afalse

17 … 1

0 … 20 … 2

6

Is 17 Pointing To The NULL?

NO!

So IF Statement Will Execute…………

Here 17 Is The Index Value ( r – ‘a’ )

NULL

SEARCHING ALGORITHMSearch: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

currentNode

SEARCHING ALGORITHMSearch: Army

SIMILARLY

SEARCHING ALGORITHMSearch: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

currentNode

SEARCHING ALGORITHMSearch: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

currentNode

SEARCHING ALGORITHMSearch: Army

if (i == word.size() – 1 && currentNode->end)

{

return true;

}

Now Check If It Is The Last Character Of The Word Has Been Reached

3 == 3? && currentNode end? YES Will Execute

SEARCHING ALGORITHMSearch: Army

Root0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

yReturn True. Item Found !

PRINTING WORD

PRINTING ALGORITHMRoot

0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")

{

if (node->end)

cout << prefix << endl;

for (int i = 0; i < 26; ++i)

{

if (node->children[i] != NULL)

{

string currentString = prefix + node->children[i]->value;

alphabetize(node->children[i], currentString);

}

}

}

PRINTING ALGORITHMRoot

0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

if (node->end) (1)

PRINTING ALGORITHM

Printing Result

CASE RESULT

CASE 1 FALSE

PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")

{

if (node->end)

cout << prefix << endl;

for (int i = 0; i < 26; ++i)

{

if (node->children[i] != NULL)

{

string currentString = prefix + node->children[i]->value;

alphabetize(node->children[i], currentString);

}

}

}

PRINTING ALGORITHMRoot

0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

if (node->children[0] != NULL) (2)

PRINTING ALGORITHM

Printing Result

CASE RESULT

CASE 1 FALSE

CASE 2 TRUE

string currentString = prefix + node->children[0]->value;

string currentString = “” +a;

string currentString = a;

alphabetize(node->children[0], currentString);

PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")

{

if (node->end)

cout << prefix << endl;

for (int i = 0; i < 26; ++i)

{

if (node->children[i] != NULL)

{

string currentString = prefix + node->children[i]->value;

alphabetize(node->children[i], currentString);

}

}

}

PRINTING ALGORITHMRoot

0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

if (node->children[1] != NULL) (3)

PRINTING ALGORITHM

Printing Result

CASE RESULT

CASE 3 FALSE

PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")

{

if (node->end)

cout << prefix << endl;

for (int i = 0; i < 26; ++i)

{

if (node->children[i] != NULL)

{

string currentString = prefix + node->children[i]->value;

alphabetize(node->children[i], currentString);

}

}

}

PRINTING ALGORITHMRoot

0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

if (node->children[2] != NULL) (4)

PRINTING ALGORITHM

Printing Result

CASE RESULT

CASE 4 FALSE

PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")

{

if (node->end)

cout << prefix << endl;

for (int i = 0; i < 26; ++i)

{

if (node->children[i] != NULL)

{

string currentString = prefix + node->children[i]->value;

alphabetize(node->children[i], currentString);

}

}

}

PRINTING ALGORITHMRoot

0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

if (node->children[15] != NULL) (17)

PRINTING ALGORITHM

Printing Result

CASE RESULT

CASE 17 TRUE

string currentString = prefix + node->children[15]->value;

string currentString = a + p;

string currentString = ap;

alphabetize(node->children[15], currentString);

PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")

{

if (node->end)

cout << prefix << endl;

for (int i = 0; i < 26; ++i)

{

if (node->children[i] != NULL)

{

string currentString = prefix + node->children[i]->value;

alphabetize(node->children[i], currentString);

}

}

}

PRINTING ALGORITHMRoot

0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

if (node->children[15] != NULL) (18)

PRINTING ALGORITHM

Printing Result

CASE RESULT

CASE 18 TRUE

string currentString = prefix + node->children[15]->value;

string currentString = ap + p;

string currentString = app;

alphabetize(node->children[15], currentString);

PRINTING ALGORITHM

SIMILARLY

PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")

{

if (node->end)

cout << prefix << endl;

for (int i = 0; i < 26; ++i)

{

if (node->children[i] != NULL)

{

string currentString = prefix + node->children[i]->value;

alphabetize(node->children[i], currentString);

}

}

}

PRINTING ALGORITHMRoot

0

a15

p15

p11

l4

e

bool end will be True

17

r12

m15

y

if (node->children[4] != NULL) (19)

PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")

{

if (node->end)

cout << prefix << endl;

for (int i = 0; i < 26; ++i)

{

if (node->children[i] != NULL)

{

string currentString = prefix + node->children[i]->value;

alphabetize(node->children[i], currentString);

}

}

}

PRINTING ALGORITHM

Printing Result

CASE RESULT

CASE 19 TRUE

string currentString = prefix + node->children[15]->value;

string currentString = appl + e;

string currentString = apple;

alphabetize(node->children[4], currentString);

PRINTING ALGORITHM

Printing Result

Print apple

PRINTING ALGORITHM

SIMILARLY

PRINTING ALGORITHM

Printing Result

Print apple

Print army

SOURCE CODETrie.h

#ifndef TRIE_H

#define TRIE_H

#include <iostream>

#include <vector>

#include <string>

#include <assert.h>

#include <new>

using namespace std;

class Node

{

public:

char value;

bool end;

Node *children[26];

Node(char value);

};

class Trie

{

public:

Trie();

void addWord(string word);

bool searchForWord(string word);

void deleteWord(string word);

Node *getRoot();

void alphabetize(Node *, string);

private:

Node *root;

};

#endif // TRIE_H

SOURCE CODETrie.c

#ifndef TRIE_CPP

#define TRIE_CPP

#include <iostream>

#include "trie.h"

using namespace std;

Node::Node(char value)

{

this->value = value;

end = false;

for(int i = 0; i < 26; ++i)

{

children[i] = NULL;

}

}

Trie::Trie()

{

root = new Node(' ');

root->end = true;

}

Node *Trie::getRoot()

{

return root;

}

SOURCE CODETrie.c

void Trie::addWord(string word)

{

Node * currentNode = root;

for (int i = 0; i < (int)word.size(); ++i)

{

char currentChar = tolower(word.at(i));

int index = currentChar - 'a';

assert(index >= 0); // Makes sure the character is between a-z

if (currentNode->children[index] != NULL)

{

// check if the current node has the current character as one of its decendants

currentNode = currentNode->children[index];

}

else

{

// the current node doesn't have the current character as one of its decendants

Node * newNode = new Node(currentChar);

currentNode->children[index] = newNode;

currentNode = newNode;

}

if (i == (int)word.size() - 1)

{

// the last character of the word has been reached

currentNode->end = true;

}

}

}

SOURCE CODETrie.c

bool Trie::searchForWord(string word)

{

Node *currentNode = root;

for(int i = 0; i < (int)word.size(); ++i)

{

char currentChar = tolower(word.at(i));

int index = currentChar - 'a';

assert(index >= 0);

if(currentNode->children[index] != NULL)

{

currentNode = currentNode->children[index];

}

else

{

return false;

}

if(i == (int)word.size() - 1 && !currentNode->end)

{

return false;

}

}

return true;

}

SOURCE CODETrie.c

void Trie::deleteWord(string word)

{

Node *currentNode = root;

for(int i = 0; i < (int)word.size(); ++i)

{

char currentChar = tolower(word.at(i));

int index = currentChar - 'a';

assert(index >= 0);

if(currentNode->children[index] != NULL)

{

currentNode = currentNode->children[index];

}

else

{

return;

}

if(i == (int)word.size() - 1 && currentNode->end)

{

currentNode->end = false;

}

}

}

SOURCE CODETrie.c

void Trie::alphabetize(Node *node, string prefix = "")

{

if (node->end)

cout << prefix << endl;

for (int i = 0; i < 26; ++i)

{

if (node->children[i] != NULL)

{

string currentString = prefix + node->children[i]->value;

alphabetize(node->children[i], currentString);

}

}

}

#endif // TRIE_CPP

SOURCE CODEMain.cpp

#include <iostream>

#include “trie.h”

using namespace std;

int main()

{

Trie * t = new Trie();

t->addWord("Carlos");

t->addWord("Perea");

t->addWord("Hello");

t->addWord("Ball");

t->addWord("Balloon");

t->addWord("Show");

t->addWord("Shower");

t->alphabetize(t->getRoot(), "");

t-> alphabetize(t->getRoot(), "");

return 0;

}

OUTPUT

APPLICATIONS OF TRIE DATA STRUCTURES

TRIES IN AUTO COMPLETE

• Since a trie is a tree-like data structure in which each

node contains an array of pointers, one pointer for each

character in the alphabet.

• Starting at the root node, we can trace a word by

following pointers corresponding to the letters in the

target word.

• Starting from the root node, you can check if a word exists

in the trie easily by following pointers corresponding to

the letters in the target word.

TRIES IN AUTO COMPLETE

• Auto-complete functionality is used widely over the

internet and mobile apps. A lot of websites and apps try to

complete your input as soon as you start typing.

• All the descendants of a node have a common prefix of

the string associated with that node.

TRIES IN AUTO COMPLETE

AUTO COMPLETE IN GOOGLE SEARCH

WHY TRIES IN AUTO COMPLETE

• Implementing auto complete using a trie is easy.

• We simply trace pointers to get to a node that represents

the string the user entered. By exploring the trie from that

node down, we can enumerate all strings that complete

user’s input.

AUTOMATIC COMMAND COMPLETION

• When using an operating system such as Unix or DOS, we

type in system commands to accomplish certain tasks.

For example, the Unix and DOS command cd may be used

to change the current directory.

SPELL CHECKERS

PHONE BOOK SEARCH

THANKS TO EVRYONE

top related