Найти все ключи в Патриции Три, которые являются префиксом строки - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь найти все ключи, хранящиеся в дереве, которые являются действительными префиксами строки.

Пример: задан файл, содержащий "ab", "abc", "abcd", "bc"и "bcd".Поиск строки «abcdefg» в дереве должен привести к «abcd», «abc», «ab».

Я хотел бы использовать реализацию java приложения appache commons patricia, но, похоже, не поддерживаетэтот вид поиска.Есть ли альтернативная реализация или простое решение этой проблемы?

1 Ответ

0 голосов
/ 11 февраля 2019

Я сам не использовал Apache Commons PatriciaTrie, но, насколько я заметил, вы можете легко получить только карту слов с префиксом какой-либо строки.Большинство примеров, которые я нашел, также предоставляют базовые операции, такие как вставка, поиск.Я также сталкивался с некоторыми обсуждениями реализации Trie в guava, но ничего особенного.

Итак, вот мое простое предложение о пользовательской реализации (но при использовании пользовательской реализации его следует покрыть хорошим набором тестов).).

public class SimpleTrie {

    private static final int ALPHABET_COUNT = 26;

    class TrieNode {
        char value;
        TrieNode[] children;
        boolean isValidWord;

        TrieNode() {
            this(' ');
        }

        TrieNode(char value) {
            this.value = value;
            children = new TrieNode[ALPHABET_COUNT];
            isValidWord = false;
        }
    }

    private TrieNode root = new TrieNode();

    public void insert(String word) {
        TrieNode current = root;

        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);

            if (current.children[c - 'a'] == null) {
                current.children[c - 'a'] = new TrieNode(c);
            }

            current = current.children[c - 'a'];
        }

        current.isValidWord = true;
    }

    public List<String> findValidPrefixes(String word) {
        List<String> prefixes = new ArrayList<>();
        TrieNode current = root;

        StringBuilder traversedPrefix = new StringBuilder();

        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);

            if (current.children[c - 'a'] != null) {
                current = current.children[c - 'a'];
                traversedPrefix.append(c);

                if (current.isValidWord) {
                    prefixes.add(traversedPrefix.toString());
                }
            }
        }

        return prefixes;
    }

    public static void main(String[] args) {
       SimpleTrie trie = new SimpleTrie();

        // insert "ab", "abc", "abcd", "bc" and "bcd"
        trie.insert("ab");
        trie.insert("abc");
        trie.insert("abcd");
        trie.insert("bc");
        trie.insert("bcd");

        List<String> validPrefixes = trie.findValidPrefixes("abcdefg");

        System.out.println(validPrefixes);
    }
}
...