Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

MakerSquare Trie Autocomplete Hints

Avatar for Elben Shira Elben Shira
March 15, 2014
76

MakerSquare Trie Autocomplete Hints

Hints for the Trie Autocomplete project.

Avatar for Elben Shira

Elben Shira

March 15, 2014
Tweet

Transcript

  1. includes(string) Returns true if string is in the trie. Strategy:

    recursively walk each character and node.
 
 Base case: string is length 1. Recursive case: node has children that matches next character.
  2. b i s d o g t _includes(“dog”, head) _includes(“og”,

    head.children[“d”]) _includes(“g”, node.children[“o”])
  3. b i s d o g t _includes(“dog”, head) _includes(“og”,

    head.children[“d”]) Base case (length is one):
 return true if g is stop node. _includes(“g”, node.children[“o”])
  4. b i s d o g t _includes(“dog”, head) _includes(“og”,

    head.children[“d”]) true _includes(“g”, node.children[“o”])
  5. this.includes  =  function(string)  {
    if  (!string  ||  string.length  ===

     0)
        return  false;
 
    return  this._includes(string,  this.head);
 }
 
 this.includes  =  function(string,  node)  {
    //  TODO  WRITE  CODE  HERE
 }
  6. iterate(node) Returns all substrings under this node. Strategy: recursively walk

    each character and node.
 
 Base case: no nodes left to iterate. Recursive case: iterate through each child, inserting substrings into a list.
  7. trie.iterate(node) b a i t d bat
 bad
 bi trie.iterate(node.children[0])

    trie.iterate(aNode.children[0])
 => [“t”] strings = [“at”]
  8. trie.iterate(node) b a i t d bat
 bad
 bi trie.iterate(node.children[0])

    trie.iterate(aNode.children[0])
 => [“t”] trie.iterate(aNode.children[1])
 => [“d”] strings = [“at”]
  9. trie.iterate(node) b a i t d bat
 bad
 bi trie.iterate(node.children[0])

    trie.iterate(aNode.children[0])
 => [“t”] trie.iterate(aNode.children[1])
 => [“d”] strings = [“at”, “ad”]
  10. trie.iterate(node) b a i t d bat
 bad
 bi trie.iterate(node.children[0])

    trie.iterate(aNode.children[0])
 => [“t”] trie.iterate(aNode.children[1])
 => [“d”] strings = [“at”, “ad”] strings =[“bat”, “bad”]
  11. trie.iterate(node) b a i t d bat
 bad
 bi trie.iterate(node.children[0])

    trie.iterate(node.children[1])
 => [“i”] trie.iterate(aNode.children[0])
 => [“t”] trie.iterate(aNode.children[1])
 => [“d”] strings = [“at”, “ad”] strings =[“bat”, “bad”]
  12. trie.iterate(node) b a i t d bat
 bad
 bi trie.iterate(node.children[0])

    trie.iterate(node.children[1])
 => [“i”] trie.iterate(aNode.children[0])
 => [“t”] trie.iterate(aNode.children[1])
 => [“d”] strings = [“at”, “ad”] strings =[“bat”, “bad”, “bi”]
  13. b i s d o g t _includes(“dog”, head) _includes(“og”,

    head.children[“d”]) Base case (length is one):
 return true if g is stop node. _includes(“g”, node.children[“o”])
  14. trie.iterate(node) b a i t d bat
 bad
 bi trie.iterate(node.children[0])

    trie.iterate(node.children[1])
 => [“i”] trie.iterate(aNode.children[0])
 => [“t”] trie.iterate(aNode.children[1])
 => [“d”] strings = [“at”, “ad”] strings =[“bat”, “bad”, “bi”]
  15. Hint 1: includes() base case this._includes  =  function(substring,  node)  {


       if  (substring.length  ===  1  &&
            node  &&  node.children[substring])  {
        //  If  this  node  is  a  stop  node,
        //  then  the  string  exists.
        //  Otherwise,  the  string  doesn't  exist.
        
        //  TODO  WRITE  CODE  HERE
    }
 
    //  Recursive  case  goes  here.
 }  
  16. Hint 2: includes() recursive case this._includes  =  function(substring,  node)  {


       //  Base  case  goes  here.
 
    var  child  =  node.children[substring[0]];
    if  (child)  {
        //  This  character  exists  in  the  tree.  Go  one  layer  down.
 
        //  TODO  WRITE  CODE  HERE
    }  else  {
        //  There  is  no  next  node  to  go  to.
        //  String  does  not  exist.
 
        //  TODO  WRITE  CODE  HERE
    }
 }  
  17. Hint 3: iterate() base cases this.iterate  =  function(node)  {
  

     if  (!node)  {
        return  [];
    }   
    if  (this.isEmpty(node.children))  {
        //  This  is  a  leaf  node.  Return  the  value.
        //  Handle  case  if  node  is  head.
        if  (node.value)  {
            return  [node.value];
        }  else  {
            return  [];
        }
    }
 
    //  TODO  WRITE  CODE  HERE
 }
  18. this.iterate  =  function(node)  {
    //  BASE  CASES  HERE
 


       var  strings  =  [];
    for  (var  char  in  node.children)  {
        var  child  =  node.children[char];
        var  childStrings  =  this.iterate(child);
        for  (var  i  in  childStrings)  {
            //  TODO  WRITE  CODE  HERE
        }
    }
    if  (node.stop)  {
        strings.push(node.value);
    }
    return  strings;
 }; Hint 4: iterate() recursive case