当前位置: 首页 > article >正文

数据结构与算法-Trie树添加与搜索

trie树的使用场景

我们若需要制作一个通讯录的软件,使用常规树结构查询的复杂度为O(logn),但trie树的复杂度确与数据多少无关,与单词长度有关,这就大大缩减的查询的时间复杂度。

trie树的基本实现

基础结构

package com.study.trieDemo;

import java.util.TreeMap;

/**
 * Created by Zsy on 2020/8/21.
 */
public class Trie {
    private class Node {
        private boolean isWord;
        private TreeMap<Character, Node> next;

        public Node(boolean isWord) {
            this.isWord = isWord;
            next = new TreeMap<Character, Node>();
        }

        public Node() {
            this(false);
        }
    }


    private Node root;
    private int size;


    public int getSize() {
        return size;
    }


 
}

添加

   /**
     * 向tire中添加一个单词
     * @param word
     */
    public void add(String word) {
        Node cur = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (cur.next.get(c) == null)
                cur.next.put(c, new Node());
            cur = cur.next.get(c);
        }

        if (!cur.isWord) {
            cur.isWord = true;
            size++;
        }
    }

搜索单词

  /**
     * 查找单词word是否在trie树中
     * @param word
     * @return
     */
    public boolean contains(String word){
        Node cur=root;
        for (int i = 0; i <word.length() ; i++) {
            char c=word.charAt(i);
            if (cur.next.get(c)==null)
                return false;
            cur=cur.next.get(c);
        }
        return cur.isWord;
    }

leetcode中关于trie的题目

208. 实现 Trie (前缀树)

208. 实现 Trie (前缀树)

实现

package com.study.leetcode;

import java.util.TreeMap;

/**
 * Created by Zsy on 2020/8/21.
 */
public class Trie_208 {


    private Node root;

    private class Node {
        private boolean isWord;
        private TreeMap<Character, Node> next;

        public Node(boolean isWord) {
            this.isWord = isWord;
            next = new TreeMap<Character, Node>();
        }

        public Node() {
            this(false);
        }
    }

    /**
     * Initialize your data structure here.
     */
    public Trie_208() {
        root = new Node();
    }

    /**
     * Inserts a word into the trie.
     */
    public void insert(String word) {
        Node cur = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (cur.next.get(c) == null)
                cur.next.put(c, new Node());
            cur = cur.next.get(c);
        }
        cur.isWord = true;
    }

    /**
     * Returns if the word is in the trie.
     */
    public boolean search(String word) {
        Node cur = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (cur.next.get(c) == null)
                return false;
            cur = cur.next.get(c);
        }
      return cur.isWord;
    }

    /**
     * Returns if there is any word in the trie that starts with the given prefix.
     */
    public boolean startsWith(String prefix) {
        Node cur = root;
        for (int i = 0; i < prefix.length(); i++) {
            char c = prefix.charAt(i);
            if (cur.next.get(c) == null)
                return false;
            cur = cur.next.get(c);
        }
        return true;
    }
}

211. 添加与搜索单词 - 数据结构设计

题目链接

211. 添加与搜索单词 - 数据结构设计

实现

package com.study.leetcode;

import java.util.TreeMap;

/**
 * Created by Zsy on 2020/8/21.
 */
public class WordDictionary_211 {

    private Node root;

    private class Node {
        private boolean isWord;
        private TreeMap<Character, Node> next;

        public Node(boolean isWord) {
            this.isWord = isWord;
            next = new TreeMap<Character, Node>();
        }

        public Node() {
            this(false);
        }
    }


    /**
     * Initialize your data structure here.
     */
    public WordDictionary_211() {
        root = new Node();
    }

    /**
     * Adds a word into the data structure.
     */
    public void addWord(String word) {
        Node cur = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (cur.next.get(c) == null)
                cur.next.put(c, new Node());
            cur = cur.next.get(c);
        }
        cur.isWord = true;
    }

    /**
     * Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter.
     */
  /**
     * 使用match进行递归查询
     * @param word
     * @return
     */
    public boolean search(String word) {
        return match(root, word, 0);
    }

    private boolean match(Node node, String word, int index) {
        if (index == word.length())
            return node.isWord;

        char c = word.charAt(index);

        if (c != '.') {
            if (node.next.get(c) == null)
                return false;
            return match(node.next.get(c), word, index + 1);
        } else {
            for (char nextChar : node.next.keySet())
                if (match(node.next.get(nextChar), word, index + 1))
                    return true;
            return false;

        }
    }

}

677. 键值映射

题目链接

677. 键值映射

题解

package com.study.leetcode;

import java.util.TreeMap;

/**
 * Created by Zsy on 2020/8/21.
 */
public class MapSum_677 {
    private class Node {

        public int value;
        public TreeMap<Character, Node> next;

        public Node(int value) {
            this.value = value;
            next = new TreeMap<Character, Node>();
        }

        public Node() {
            this(0);
        }
    }

    private Node root;

    /**
     * Initialize your data structure here.
     */
    public MapSum_677() {

        root = new Node();
    }

    /**
     * 非递归法插入节点,通过查询next中是否存在对应key的节点,进行相应插入操作
     * @param key
     * @param val
     */
    public void insert(String key, int val) {

        Node cur = root;
        for (int i = 0; i < key.length(); i++) {
            char c = key.charAt(i);
            if (cur.next.get(c) == null)
                cur.next.put(c, new Node());
            cur = cur.next.get(c);
        }
        cur.value = val;
    }


    /**
     * 找到匹配节点的指针,将地址传给sum进行递归计算
     * @param prefix
     * @return
     */
    public int sum(String prefix) {
        Node cur = root;
        for (int i = 0; i < prefix.length(); i++) {
            char c = prefix.charAt(i);
            if (cur.next.get(c) == null)
                return 0;
            cur = cur.next.get(c);
        }
        return sum(cur);
    }

    private int sum(Node node) {
        //省略了if(node==null) return 0;

        int value = node.value;
        for (char c : node.next.keySet()) {
            value+=sum(node.next.get(c));
        }
        return value;
    }
}


http://www.kler.cn/a/315053.html

相关文章:

  • Dolby TrueHD和Dolby Digital Plus (E-AC-3)编码介绍
  • 软件测试面试大全(含答案+文档)
  • 力扣662:二叉树的最大宽度
  • Vue.js 项目创建流程
  • 关于GCC内联汇编(也可以叫内嵌汇编)的简单学习
  • flutter 发版的时候设置版本号
  • 茴香豆的茴的写法-SpringBoot处理客户端请求的几种方式
  • 并发与并行的区别:深入理解Go语言中的核心概念
  • 大模型安全风险分析
  • 如何在WordPress中添加事件Schema(分步指南)
  • 小世界网络 | “小世界”网络和无标度网络
  • 开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-快速体验(十三)
  • 695. 岛屿的最大面积
  • C# 访问Access存取图片
  • 实时流处理框架(如Flink、Spark Streaming)
  • 系统架构设计师:软件可靠性
  • Flyway 常见问题与解决方案
  • c语言编写程序,找出出现次数最高的数字 数字范围1-1000 时间复杂度不超过O(n)
  • html,css基础知识点笔记(二)
  • VB中的垃圾回收(Garbage Collection)机制
  • 二叉搜索树(附源码C++)
  • 将sqlite3移植到开发板上
  • frp内网穿透部署
  • vue一级、二级路由设计
  • 论文阅读-Demystifying Misconceptions in Social Bots Research
  • Ubuntu20.04 搜索不到任何蓝牙设备