【问题标题】:Search Trie implementation搜索 Trie 实现
【发布时间】:2014-06-30 06:04:53
【问题描述】:

我写了一段代码StringTrie.java,通过接口Trie.java实现:

package il.ac.tau.cs.sw1.trie;
import java.util.Set;

/**
 * Represents a generic trie data structure, where K is the type of keys that
 * are saved in the trie, and V is the type of values that can be saved for each
 * key.
 */
public interface Trie<K, V> {

    /**
     * Adds the input key to the data structure with the given value. If the key
     * is invalid for this trie (implementation-dependent) an exception is
     * thrown.
     */
    void addKey(K key, V value);

    /**
     * Searches all the keys in the trie structure with the given prefix. If
     * there are no such keys - an empty Set is returned. Otherwise, all the values saved
     * for these keys are added to the output value set. If the prefix is invalid for this
     * trie (implementation-dependent) an exception is thrown.
     * 
     * @post the return value is not null
     */
    Set<V> searchByPrefix(K prefix);

}

连同通过TrieNode.java实现的StringTrieNode.java:

package il.ac.tau.cs.sw1.trie;

import java.util.List;
import java.util.Set;

/**
 * Represents a node in a generic trie, where K is the type of keys that are
 * saved in the trie, and V is the type of values that can be saved for each
 * key.
 */
public interface TrieNode<K, V> {

    /**
     * Adds the key suffix to this trie node, with the given value, by
     * recursively adding the suffix of this suffix to the relevant child node.
     * 
     * @pre suffix is a valid suffix for this trie (implementation-dependent)
     * @post if the key ends in this trie node, the input value is added to the
     *       set of values returned by getValues().
     */
    void addSuffix(K suffix, V value);

    /**
     * Returns the set of values for keys that end in this node
     */
    Set<V> getValues();

    /**
     * Returns the child trie node such that the input suffix is saved in it or
     * in its descendant
     * 
     * @pre suffix is a valid suffix for this trie (implementation-dependent)
     * @post if no key with such a suffix exists in the trie, or if suffix ends
     *       in the current node, return null; otherwise return the relevant
     *       child node
     */
    TrieNode<K, V> getNext(K suffix);

    /**
     * Returns a list with all the child trie nodes of this node. The list may
     * contain null values.
     * 
     * @post $ret != null
     */
    List<TrieNode<K, V>> getNexts();

}

现在,我已经实现了所有功能(我希望是正确的),现在我只遇到了 Set searchByPrefix(K prefix); 的问题,我找不到有效的算法 + 我的构造函数有问题。用户这样称呼它: Trie names = new StringTrie();所以第一个必须在那里。但只有第二个缩写字段。可以吗?

【问题讨论】:

  • 有一个完整的实现here。

标签: java generics trie


【解决方案1】:

我建议您使用现有的实现。

这是一个很好的例子,我已经用过很多次了:

https://github.com/rkapsi/patricia-trie

这里是一个使用前缀搜索的例子:

PatriciaTrie<String, String> trie = new PatriciaTrie<String, String>(StringKeyAnalyzer.CHAR);
trie.put("prefix1", value);
trie.put("prefix2", value);

map = trie.prefixMap("prefix");

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    相关资源
    最近更新 更多