算法竞赛常用数据结构-字典树Trie

本文参考资源:

详谈树结构(传统树、字典树、hash 树、Merkle Patricia Tree)_C/C++_smilejiasmile的博客-CSDN博客

概述

Tire树称为字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。高效查找的数据结构-HashTree(哈希树))典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

Trie树的缺点是它非常消耗空间。

Trie树的三个基本性质:

  • 根节点不包含字符,除根节点外每一个节点都只包含一个字符;
  • 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
  • 每个节点的所有子节点包含的字符都不相同。

Trie树结构

算法竞赛常用数据结构-字典树Trie

从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

Trie树的应用有:

  1. 维护字符串集合(即字典)。
  2. 向字符串集合中插入字符串(即建树)。
  3. 查询字符串集合中是否有某个字符串(即查询)。
  4. 统计字符串在集合中出现的个数(即统计)。
  5. 将字符串集合按字典序排序(即字典序排序)。
  6. 求集合内两个字符串的LCP(Longest Common Prefix,最长公共前缀)(即求最长公共前缀)。

大多数时候,我们是要维护一个key-value对,key就是这个从根节点到叶子节点形成的字符串,而value信息就存储在叶子节点,例如汉英字典去查一个单词的中文翻译。

java代码实现:(根据不同的应用可以设计不同的实现)

class Node{
    int num;//有多少单词通过这个节点,即由根至该节点组成的字符串模式出现的次数
    Node[] children = new Node[26];//所有的子节点
    Object data;// 如果是叶子节点可以存储数据。
}

算法题示例

你考入大城市沙坪坝的学校, 但是沙坪坝的当地人说着一种很难懂的方言, 你完全听不懂。 幸好你手中有本字典可以帮你。 现在你有若干个听不懂的方言需要查询字典。

输入格式:
第一行,两个整数n和m。
接下来有n行表示字典的内容,每行表示一条字典的记录。每条记录包含两个空格间隔的单词,第一个单词为英文单词,第二个单词为对应的沙坪坝方言。
接下来有m行,每行一个单词,表示你要查询的沙坪坝方言。

输出格式:
输出m行,每行一个英文单词,表示翻译后的结果。
如果某个单词字典查不到,输出"eh"

样例输入:
5  3
dog  ogday
cat  atcay
pig  igpay
froot  ootfray
loops  oopslay
atcay
ittenkay
oopslay
样例输出:
cat
eh
loops
 注:所有单词都用小写字母表示, 且长度不超过10。

解答:

static class Node{
    Node[] children = new Node[26];//所有的子节点
    String data;// 如果是叶子节点可以存储数据。
}

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int referCount = scanner.nextInt();
    int targetCount = scanner.nextInt();
    Node root = new Node();
    for(int i = 0;i<referCount;i++){
        String origin = scanner.next();
        char[] refer = scanner.next().toCharArray();
        Node node = root;
        for(int n = 0;n<refer.length;n++){
            if(node.children[refer[n]-'a'] != null) {
                node = node.children[refer[n]-'a'];
                continue;
            }
            node = (node.children[refer[n]-'a'] = new Node());
            if(n == refer.length-1) node.data = origin;
        }
    }
    for(int i = 0;i<targetCount;i++){
        char[] toFind = scanner.next().toCharArray();
        Node node = root;
        boolean isFind = true;
        for(int n = 0;n<toFind.length;n++){
            if((node = node.children[toFind[n]-'a'])!=null) continue;
            isFind = false;
            break;
        }
        System.out.println(isFind?node.data:"eh");
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/%e7%ae%97%e6%b3%95%e7%ab%9e%e8%b5%9b%e5%b8%b8%e7%94%a8%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84-%e5%ad%97%e5%85%b8%e6%a0%91trie/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年2月17日
下一篇 2020年2月17日

相关推荐

  • 高效查找的数据结构-HashTree(哈希树)

    本文参考资源: 痴人说Hash - 哈希树 (HashTree)_Java_PinusLee阳光灿烂的生活-CSDN博客 查找——图文翔解HashTree(哈希树)Java菜鸟的自…

    2020年2月17日
    04850
  • leetcode232-用栈实现队列

    原题 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – …

    算法 2019年12月13日
    0560
  • 跳表-披着链表外衣的伪搜索树

    本文参考资源: 【数据结构与算法】之跳表(Java实现)---第九篇Java震哥聊校招-CSDN博客 跳表的原理及实例 - Rogn - 博客园 跳表Java实现Java偏离的定弦…

    2020年3月28日
    0670
  • leetcode173-二叉搜索树迭代器

    原题 实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。 调用 next() 将返回二叉搜索树中的下一个最小的数。 示例: BSTIterator iterator…

    2020年1月16日
    060
  • leetcode385-迷你语法分析器

    原题 给定一个用字符串表示的整数的嵌套列表,实现一个解析它的语法分析器。 列表中的每个元素只可能是整数或整数嵌套列表 提示: 你可以假定这些字符串都是格式良好的: 字符串非空 字符…

    算法 2020年1月28日
    02260
  • leetcode380-常数时间插入、删除和获取随机元素

    原题 设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。 insert(val):当元素 val 不存在时,向集合中插入该项。 remove(val):元素 v…

    2019年12月28日
    0100
  • AVL树-自平衡的二叉搜索树

    本文图片来源:手把手教,手写AVL树 - 不止是编程 - 博客园 AVL树的概念 自平衡 当二叉搜索树处于平衡状态的时候,其操作时间复杂度为O(logN),但当二叉搜索树是单支树的…

    2019年11月25日
    0430
  • leetcode155-最小栈

    原题 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() …

    算法 2019年12月11日
    0130
  • leetcode225--用队列实现栈

    原题 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意: 你只能…

    算法 2019年12月13日
    0120
  • leetcode706-设计哈希映射

    原题 不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更…

    算法 2019年12月18日
    0120

发表回复

登录后才能评论