使用Trie进行词典排序

时间:2014-01-28 17:55:22

标签: java trie

enter image description here根据维基百科,关于特里:

  

一组密钥的字典排序可以通过简单的基于特里的算法完成,如下所示:

     
      
  • 将所有密钥插入路径。
  •   
  • 通过预订遍历输出特里结构中的所有键,从而使输出按字典顺序递增。
  •   

但是,这是我使用标准trie实现的测试:

Trie trie = new Trie();
trie.add("doll");
trie.add("ball");
trie.add("bat");
trie.add("dork");
trie.add("dorm");
trie.add("send");
trie.add("sense");
trie.add("sent");

预购打印输出:

     public List<String> allWords(){

    List<String> words = new ArrayList<String>();

    if(root == null){
        return words;
    }

    StringBuilder prefix = new StringBuilder();
    getAllWords(root.children,prefix,words);

    return words;
}

// depth first search
private void getAllWords(List<TrieNode> children, StringBuilder prefix,  List<String> words){

    for(int i= 0; i<children.size(); i++){
        TrieNode child = children.get(i);
        if(!child.isWord_){
            prefix.append(child.data_);
            allWordsHelper(child.children, prefix, words);
        }else{
            prefix.append(child.data_);
            words.add(prefix.toString());
        }
        prefix.deleteCharAt(prefix.length()-1);
    }
}

输出顺序为:doll dork dorm ball bat send sense sent

'词典排序'是什么意思?输出顺序似乎与插入顺序更相关,而不是字典顺序。我弄错了吗? 以这棵树为例,预购打印输出将是“以茶为特色的一家酒店”。字典顺序在哪里?

2 个答案:

答案 0 :(得分:1)

关于使用尝试进行词典排序的正确方法是:

trie中节点的前序与它们所代表的字符串的词典顺序相同,假设节点的子节点由边标签排序。

现在,如果你在代码中尝试了这个,那么预先遍序遍历应该按照字典顺序给你字符串。

以下是一个示例:http://www.cs.helsinki.fi/u/tpkarkka/opetus/12s/spa/lecture02.pdf

的参考

答案 1 :(得分:0)

据我说,它应该是Inorder遍历。可以遍历特里使得具有小于根值的键的所有分支首先被处理,然后打印根值,并且最后所有值都大于根值。这是标准 inorder遍历,但我想要做的唯一一点是,你必须编写自定义逻辑来处理所有分支的密钥首先小于root的密钥,在一个普通的二叉树中,它只是root.left,但由于在trie中没有左/右,我们必须回到BST中左右的本质。(其顺序也按字典顺序排序)价值观。)