Улучшение эффективности Дерева - PullRequest
0 голосов
/ 16 марта 2019

Я только начал изучать сложные структуры данных, и это моя первая реализация Trie.Я пытался реализовать Trie, который поддерживает вставку, удаление и обновление.Однако я не могу найти эффективный способ обновления oldStrings в newStrings.Я могу только просто удалить (oldString) и вставить (newString).

Есть ли эффективный способ сделать то же самое?

Это класс TrieNode

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class TrieNode{
    private Map<Character, TrieNode> children;
    private boolean wordBreak;
    private int count;

    TrieNode(){
        this.children = new HashMap<>();
        this.wordBreak = false;
        this.count = 0;
    }

    public Map<Character, TrieNode> getChildren() {
        return children;
    }

    public boolean isWordBreak() {
        return wordBreak;
    }

    public void setWordBreak(boolean wordBreak) {
        this.wordBreak = wordBreak;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

Это класс Trie

public class Trie{
    private final TrieNode root;

    Trie(){
        root = new TrieNode();
    }

    public void insert(String word){
        TrieNode current = root;
        for(char c : word.toCharArray()){
            TrieNode node = current.getChildren().get(c);
            if(node == null) {
                node = new TrieNode();
                current.getChildren().put(c, node);
            }
            current = node;
        }
        current.setWordBreak(true);
        current.setCount(current.getCount() + 1);
    }

    public void update(String oldWord, String newWord){
        delete(oldWord);
        insert(newWord);
    }

    public int query(String word){
        TrieNode current = root;
        for(char c : word.toCharArray()){
            TrieNode node = current.getChildren().get(c);
            if(node == null)
                return 0;
            current = node;
        }
        return current.isWordBreak() ? current.getCount() : 0;
    }

    private boolean delete(TrieNode current, String word, int index){
        if(index == word.length()){
            if(!current.isWordBreak())
                return false;
            current.setWordBreak(false);
            current.setCount(current.getCount() - 1);
            return current.getChildren().size() == 0;
        }
        char c = word.charAt(index);
        TrieNode node = current.getChildren().get(c);
        if(node == null)
            return false;
        boolean isSafeToDelete = delete(node, word, index + 1);
        if(isSafeToDelete){
            current.getChildren().remove(c);
            current.setCount(current.getCount() - 1);
            return current.getChildren().size() == 0;
        }
        return false;
    }

    public void delete(String word){
        delete(root, word, 0);
    }
...