前缀树实现(模糊查询)

public class PrefixTree {
    /*
     * 前缀树:以26位字母作为前缀树
     */
    Node<Character > head = new Node<>();
    
    public static void main(String[] args) {
        PrefixTree prefixTree = new PrefixTree();
        prefixTree.insert("abcdef");
        prefixTree.insert("aecd");
        prefixTree.insert("aecd");
        prefixTree.insert("abcde");
        prefixTree.insert("aecdsss");
        int times = prefixTree.searchTimes("aecd");
        int likeTimes = prefixTree.searchTimesByLike("ae");
        System.out.println("times:"+times);
        System.out.println("likeTimes:"+likeTimes);
        prefixTree.delete("aecd");
        times = prefixTree.searchTimes("aecd");
        likeTimes = prefixTree.searchTimesByLike("ae");
        System.out.println("times:"+times);
        System.out.println("likeTimes:"+likeTimes);
    }
    
    //插入一个字符串形成前缀树
    public void insert(String str) {
        if(StringUtils.isEmpty(str)) {
            return;
        }
        char[] charArr = str.toLowerCase().toCharArray();
        Node<Character> node = head;
        node.pass++;//记录总数
        for(int i =0;i<charArr.length;i++) {
            char item = charArr[i];
            int index = item - 'a';
            Node[] nextNodeArr = node.nextNodeArr;
            if(nextNodeArr == null) {
                nextNodeArr = new Node[26];
                node.nextNodeArr = nextNodeArr;
                Node<Character> nextNode = new Node<>(item);
                nextNodeArr[index] = nextNode;
                node = nextNode;
            }else {
                Node<Character> nextNode = nextNodeArr[index];
                if(nextNode == null) {
                     nextNode = new Node<>(item);
                     nextNodeArr[index] = nextNode;
                }
                node = nextNode;
            }
            node.pass++;
        }
        node.end++;
    }
    //删除前缀
    public void delete(String str) {
        if(StringUtils.isEmpty(str)) {
            return;
        }
        //先判断该删除的前缀是否存在
        int times = searchTimes(str);
        if(times ==0) {
            return;
        }
        //不断的遍历获取知道通过次数为0 说明只有这个删除字符前缀了
        char[] charArr = str.toLowerCase().toCharArray();
        Node<Character> node = head;
        for(int i =0;i<charArr.length;i++) {
            char item = charArr[i];
            int index = item - 'a';
            Node[] nextNodeArr = node.nextNodeArr;
            Node nextNode = nextNodeArr[index];
            nextNode.pass--;
            if(nextNode.pass==0) {
                nextNodeArr[index] = null;
                break;
            }
            node = nextNode;
        }
        //走到这里说明有重复的删除字符前缀
        node.end--;
    }
    //查询次数
    public int searchTimes(String str) {
        if(StringUtils.isEmpty(str)) {
            return 0;
        }
        char[] charArr = str.toLowerCase().toCharArray();
        Node<Character> node = head;
        for(int i =0;i<charArr.length;i++) {
            char item = charArr[i];
            int index = item - 'a';
            Node[] nextNodeArr = node.nextNodeArr;
            if(nextNodeArr == null) {
                return 0;
            }
            Node nextNode = nextNodeArr[index];
            if(nextNode == null) {
                return 0;
            }
            node = nextNode;
        }
        return node.end;
    }
    //模糊查询次数
    public int searchTimesByLike(String str) {
        if(StringUtils.isEmpty(str)) {
            return 0;
        }
        char[] charArr = str.toLowerCase().toCharArray();
        Node<Character> node = head;
        for(int i =0;i<charArr.length;i++) {
            char item = charArr[i];
            int index = item - 'a';
            Node[] nextNodeArr = node.nextNodeArr;
            if(nextNodeArr == null) {
                return 0;
            }
            Node nextNode = nextNodeArr[index];
            if(nextNode == null) {
                return 0;
            }
            node = nextNode;
        }
        return node.pass;
    }

}
class Node<T>{
    T item;
    //通过数量
    int pass;
    //结尾数量
    int end;
    //下一位数量
    Node[] nextNodeArr;
    public Node() {}
    public Node(T item) {
        this.item = item;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值