使用两次尝试实现电话目录

时间:2016-07-20 23:37:35

标签: string algorithm trie

    I have encountered an interview question
    “Implement a phone directory using Data Structures”                

我想用try来解决它。通过尝试解决它,我尝试使用两次尝试,一次用于名称,另一次用于电话号码,         但我遇到了困难         假设,我必须添加三个条目(AB“112”BC“124”CD“225”)         然后,如果我查询数字“225”的名称,我该如何返回CD。         也就是说,这两个尝试将如何联系起来。

    One approach I was thinking was taking two pointers in both the tries.
    These pointers will point to the first and last word in the other trie.
    For example,if the structures are as follows:

    Struct nametrie                            
    {                                                       
     Struct nametrie *child[26];
     struct phonetrie*head,*tail;
     struct phonetrie*root;       

     -----------    
    }                                                       

      Struct phonetrie
     {
             struct phonetrie*child[9];
             struct nametrie*head,*tail;
             struct nametrie*root;
        ----------- 
      }


    Then for AB “112”,  
    Name trie willstore head(1) and tail (2).

但我认为这种方法不适用于重复的条目(一个名称和多个数字。)

Can someone please explain a good approach.I am not looking for code but good understanding of approach,may be via diagram or algorithm.

1 个答案:

答案 0 :(得分:0)

我不知道C所以我不能在你的代码中发表评论。

使用尝试的想法是有效的。

您似乎错过了节点在尝试中可以容纳的数据

树中的节点有2个主要组件

  1. 它拥有的数据可以是任何类型
  2. 儿童(或左,右儿童)或任何儿童组合的清单
  3. 我们将在这里做的是我们将为每个节点添加另一个字段并将其称为值" theValue"

    所以trie节点看起来像这样

    Class TrieNode{
    public char theChar;
    public String theValue;
    public List<TrieNode> children;
    }
    

    因此,对于正向查找(名称到电话),您构建一个Trie,并在与目录中的条目匹配的节点上,将该值设置为该值。

    你需要创建第二个trie才能进行反向查找(手机到名称)

    那么为了举例说明这个数据的样子是

    (AB“112”AC“124”ACD“225”)

    //create nodes
    TrieNode root = new TrieNode();
    TrieNode A = new TrieNode();
    A.theChar = 'A';
    TrieNode B = new TrieNode();
    A.theChar = 'B';
    TrieNode C = new TrieNode();
    A.theChar = 'C';
    TrieNode C2 = new TrieNode();
    A.theChar = 'C';
    TrieNode D = new TrieNode();
    A.theChar = 'D';
    //link nodes together
    root.children = new ArrayList<>();
    root.children.add(A);
    A.children = new ArrayList<>();
    A.children.add(B);
    A.children.add(C);
    B.children = new ArrayList<>();
    B.children.add(C2);
    //fill the data
    B.theValue = "112";
    C.theValue = "124";
    C2.theValue = "225";
    

    现在您可以轻松遍历此Trie,当您到达某个节点并想要检查该值时,只需阅读该值

    我希望很清楚