字典树数组实现「建议收藏」

字典树数组实现「建议收藏」字典树是一种很实用也相对好理解的数据

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

   

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

之前在网上找的都是些用指针实现的,代码看起来很难懂,今天学习了一种用数组实现的。学习起来简单易懂


int ch[200010][27];  //节点编号   
int sz;        //字典树节点个数
int val[200010];   //节点的值
void init()
{
    sz=1;
    memset(ch,0,sizeof(ch));
    memset(val,0,sizeof(val));
}
void insert(char *s)
{
    int u=0,c;
    for(int i=0;i<strlen(s);i++)
    {
        c=s[i]-'a';
        if(!ch[u][c])
            ch[u][c]=sz++;
        u=ch[u][c];
        val[u]++;        //!!!
    }
}
int query(char *s)
{
    int u=0,c;
    for(int i=0;i<strlen(s);i++)
    {
        c=s[i]-'a';
        if(!ch[u][c])
            return 0;
        u=ch[u][c];
    }
    return  val[u];
}

说明一下代码中注释的部分,这个语句放在for循环外面有时也是很方便的,当遇到一些特殊的标记,比如1或-1,就代表着字符串的结束,而字符串的中间部分默认都为0。这在有些题中使用是很方便的。


这个数组实现和指针的版本也是有些区别的,数组的版本并不怎么直观,因为在数组中实现的树没有“层”的概念。代替的是节点的“编号”,通过这个编号可以向“下一层”去找节点,也可以通过编号获得字符串的一些其他信息,很多题都需要在结构体或是数组中记录或保存信息,当然这个下标利用的就是“编号”。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197523.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sql 左连接,内连接 的写法「建议收藏」

    左连接的含义:使用LEFTJOIN关键字,会从左表那里返回所有的行,即使在右表中没有匹配的行。1)左连接selecta.*,b.*fromtable1aleftjointable2bona.id=b.parent_id2)内连接selecta.*,b.*f…

    2022年4月13日
    46
  • 分布式锁的实现和应用场景_predis分布式锁的应用

    分布式锁的实现和应用场景_predis分布式锁的应用文章目录如何理解分布式锁分布式锁的常用实现基于关系型数据库存在单点故障风险不可重入无法实现阻塞应用Redis缓存基于ZooKeeper实现电商网站都会遇到秒杀、特价之类的活动,大促活动有一个共同特点就是访问量激增,在高并发下会出现成千上万人抢购一个商品的场景。虽然在系统设计时会通过限流、异步、排队等方式优化,但整体的并发还是平时的数倍以上,参加活动的商品一般都是限量库存,如何防止库存超卖,避免并发问题呢?分布式锁就是一个解决方案。如何理解分布式锁我们都知道,在业务开发中,为了保证在多线程下处理

    2025年10月3日
    3
  • flume和kafka区别

    flume和kafka区别kafka和flume都是日志系统,kafka是分布式消息中间件,自带存储;flume每一部分都是可以定制。kafka更合适做日志缓存,flume数据采集部分做的很好,可以定制很多数据源,减少开发量。kafka和flume都是日志系统,kafka是分布式消息中间件,自带存储,提供push和pull存取数据功能。flume分为agent(数据采集器),collector(数据简单处理和写入),storage(存储器)三部分,每一部分都是可以定制的。比如agent采用RPC(Thri.

    2022年6月23日
    28
  • SynchronousQueue用例「建议收藏」

    SynchronousQueue用例「建议收藏」SynchronousQueue是无缓冲区的阻塞队列,即不能直接向队列中添加数据,会报队列满异常,如下所示:importjava.util.concurrent.SynchronousQueue;publicclassSynchronousQueueExp{ publicstaticvoidmain(String[]args){ SynchronousQueu…

    2022年6月22日
    30
  • Could not initialize class org.xerial.snappy.Snappy

    Could not initialize class org.xerial.snappy.Snappy

    2021年5月13日
    165
  • LaTeX求和符号_matlab中求和符号怎么表示

    LaTeX求和符号_matlab中求和符号怎么表示Latex的求和公式:若想输出∑i=0n\sum_{i=0}^n∑i=0n​则需要输入:$\sum_{i=0}^n$其中,\sum是求和符号,下划线_之后为起始条件,^是终止条件

    2022年10月12日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号