字典树(Trie)

别只盯着IDA了!用Python脚本搞定pyc逆向与ELF密码破解(附完整代码) 本文探讨了使用Python脚本进行逆向工程的高效方法,特别针对pyc文件反编译和ELF密码破解两大场景。通过实战案例展示了如何利用Python的动态调试能力、字节码操作和跨平台兼容性,快速构建自动化逆向工具链,相比传统工具如IDA Pro更具灵活性和效率。 阅读详情

博客通过学习这篇博客(https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html)+自己的理解写的

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

字典树其实主要就是查询,当你查询的时候,你其实是不知道你最开始是插入的是什么,只是通过特定的路径去判断这个字符串有没有出现过。所以一般由来查找字符串有没有出现过或者出现的次数。

什么时候用比较好,比如有n次输入m次查询,你就不能一次又一次的遍历,时间复杂度太高了,所以需要字典树,字典树的时间复杂度是O(m * n)。

如何存储字符串呢?字典树储在一个树上,比如只含有26个字母的字符串,从跟开始每个节点最多有26个子节点。用树的枝干来存储数据。如图:

图片来自 https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html

可以顺着枝干,找到cat,cash,app,apple,aply等,这就是构建字典树的过程。

如何建树?代码如图所示:

void Insert(char *s, int rt){
     len = strlen(s);
     for(int i = 0; i < len; i++){
        int id = s[i] - 'a';
        if(!trie[rt][id]){
            trie[rt][id] = ++ tot;
        }
        rt = trie[rt][id];
     }
}

那么查询呢?

bool Find(char *s, int rt){
    len = strlen(s);
    int cn = 0;
    for(int i = 0; i < len; i++){
        int id = s[i] -'a';
        if(trie[rt][id] != 0)cn++;
        rt = trie[rt][id];
    }
    if(cn = len)return true;
    else return false;
}

例题:

统计难题     HDU   1251

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 2000005
int trie[maxn][26];
int sum[maxn], len, tot;
char s[12];
void Insert(char *s, int rt){
     len = strlen(s);
     for(int i = 0; i < len; i++){
        int x = s[i] - 'a';
        if(!trie[rt][x]){
            trie[rt][x] = ++tot;
        }
        sum[trie[rt][x]]++;

        rt = trie[rt][x];
     }
}
int Find(char *s, int rt){
    len = strlen(s);
    for(int i = 0; i < len; i++ ){
        int x = s[i] - 'a';
        if(trie[rt][x] == 0)return 0;
        rt = trie[rt][x];
    }
    return sum[rt];
}
int main(){
    int rt = 0;
    tot = 0;
    while(cin.getline(s,12)){    //输入单词
         if(strlen(s)==0 || s[0]==' ')    //如果读入字符串的长度为0或者是空格,说明读入的是空行
            break;
        Insert(s, rt);
     }
     while(scanf("%s",s)!=EOF){
         printf("%d\n",Find(s, rt));    //返回s为前缀的单词的数量
     }
return 0;
}

Phone List   HDU   1671

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
#define N 111111
int trie[N][11];
int vis[N];
char s[15];
int  n, T, tot, rt, flag;
int Insert(char *s)
{
    int len = strlen(s);
    rt = 0;
    int ans = 0;
    for(int i = 0; i < len; i++)
    {
        int x = s[i] - '0';
        if(!trie[rt][x]){
                memset(trie[tot], 0, sizeof(trie[tot]));
                trie[rt][x] = tot++;
                ans ++;
        }
        else if(vis[trie[rt][x]])flag = 1;
        rt = trie[rt][x];

    }
    if(!ans)flag = 1;
    vis[rt]++;
}

int main()
{
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        tot = 1;
        flag = 0;
        memset(trie[0], 0, sizeof(trie[0]));
        memset(vis, 0, sizeof(vis));
        while(n--)
        {
            scanf("%s", s);
            if(!flag)
            {
                Insert(s);
            }
        }
        if(flag)printf("NO\n");
        else printf("YES\n");
    }

}

单词数    HDU  2072

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include <iostream>
#include <cstdio>
#include <sstream>
#include <set>
using namespace std;
#define N 100000
int trie[N][26];
int vis[N];
int tot, rt, len, ans;
void Insert(string s)
{
    rt = 0;
    len = s.size();
    for(int i = 0; i < len; i++)
    {
        int x = s[i] - 'a';
        if(!trie[rt][x])
        {
            memset(trie[tot], 0, sizeof(trie[tot]));
            trie[rt][x] = tot++;
        }
        rt = trie[rt][x];
    }
    if(!vis[rt]&& rt != 0)
    {
        ans ++;
    }
    vis[rt] = 1;
}
int main()
{
    string s;
    memset(vis, 0, sizeof(vis));
    memset(trie[0], 0, sizeof(trie[0]));
    tot = 1;
    ans = 0;
    while(getline(cin, s) && s != "#")
    {
        istringstream sin(s);
        string w;
        while(sin >> w)
            Insert(w);


    }
    cout << ans << endl;

    return 0;
}

题目:前缀统计

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int trie[maxn][26];
int sum[maxn], tot = 0;
char str[maxn];
void Insert(char *s, int rt)
{
    int len = strlen(s);
    for(int i = 0; i < len; i++)
    {
        int x = s[i] - 'a';
        if(!trie[rt][x])
        {
            trie[rt][x] = ++tot;
        }
        rt = trie[rt][x];

    }
    sum[rt]++;
}
int query(char *s, int rt)
{
    int len = strlen(s);
    int ans = 0;
    for(int i = 0; i < len; i++)
    {
        int x = s[i] - 'a';
        if(!trie[rt][x])return ans;
        if(trie[rt][x]) ans += sum[trie[rt][x]];
        rt = trie[rt][x];
    }
    return ans;
}
int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    while(n--)
    {
        scanf("%s", str);
        Insert(str, 0);
    }
    while(m--)
    {
        scanf("%s", str);
        printf("%d\n",query(str, 0));
    }
    return 0;
}

 

字典树trie详解 trie 简介 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。 Trie这个术语来自于retrieva... 阅读详情

相关推荐

“华为”云桌面系统声音比较小,如何调大?

调整操作系统声音 开启云桌面,登录账户之后,进入操作系统,鼠标左键点击右下角的声音图标,把声音调到最大(如下图); 可以考虑使用浏览器在线听音乐,确定声音的音量! 如果只是耳麦声音小,可以鼠标右键点击声音图标,选择录音设备(R),如下图: 点击“录音设备(R)”后进入,鼠标右键点击“麦克风”选择属性,将侦听级别调至最大,确定! 调整华为云终端声音(软设置) 将鼠标移至桌面的顶端中间位置,打开如下图的样式图标,鼠标左键点击“主页”; 点击“主页”之后,将回到云桌面的终端操作界面,

shunchang的专栏 2336

字典树 Trie

1.什么是字典树 字典树,又称单词查找树或者键树,或者前缀树,是哈希树的一种变种,典型的应用就是保存大量的字符串的信息,统计和排序大规模字符串,因为采用了前缀的概念,压缩存储了部分的字符串,所以说,查询和查找效率都非常的高,接近于哈希 主要思想就是,利用了空间换时间的思路,将多个字符串的最大公共前缀压缩存储 示例图: 2.字典树的ADT 描述如下: 1.根节点不含有键值 2.

72 73 76 89 82 84 89 81 1020

专治疑难系列 - 解决打印机凭证冲突问题

一、问题描述 二、解决方法 三、问题已解决

Passerby_Wang的博客 2万+

trie数(字典树)模板题

需要注意的一点,本题maxnode太大,应该将字典树开在全局变量。 代码: #include <stdio.h> #include <string.h> #include <cmath> #include <algorithm> #include <iostream> #include<vector> #include<...

weixin_43175029的博客 177

【正点原子I.MX6U-MINI移植篇】Ubuntu-base根文件系统移植构建过程详解(四)

能不能在ARM板上运行Ubuntu呢?答案肯定是可以的,Ubuntu是Linux系统的一种,可以简单的将Ubuntu理解为一个根文件系统,和我们用busybox、buildroot制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上。

果果小师弟的博客 3767

SI案例分享--考虑ESD保护二极管的差分线阻抗仿真

PCB设计中的cut out参考面早已是SI评估中常用的阻抗优化方式,通过合理的仿真建模,可以提供合适的设计参考,并保持与测试结果的高度一致性。

一只豌豆象的博客 1436

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符; (2)从根节点到某一节点,路径...

SmartSi 777

详细分析一下华为自研的MetaERP系统中的合并报表流程与规则

华为MetaERP合并报表系统针对其全球化复杂业务量身定制,采用五层自动化架构:统一数据采集、多币种转换、智能对账协同、规则化抵消处理及多维分析输出。系统核心在于可配置的智能规则引擎,涵盖股权合并范围、内部交易抵消、未实现利润计算等复杂场景,实现多准则并行处理。相比传统软件,该系统深度集成业务数据、支持准实时合并,并通过参数化配置快速适应组织变革,成为华为全球财务管控的"数字神经中枢",在效率、准确性和安全性上具有显著优势。

金牌架构师 673

字典树小结

字典树: 字典树 即Tire树,以一个空的头结点分若干的分支,来存放数据,虽浪费了大量内存,但是查找速度非常快。 匹配 时间复杂度 O(n) n = strlen(a); 字典树分 3步,建树、插入、查找 当然有时候,建树的选择是很重要的一点,尽量本着少往字典树上添加节点的原则,容易爆!!! 列入下面这题,用m建树,n来查找,即可AC,如果用n来建

NotPerfect-EOF 1213

【宝藏级】全网最全的Pandas详细教程(2万字总结)

【回炉重造】Python之Pandas详细教程前言为什么要学习pandas?什么是Pandas?官网1. Pandas的索引操作索引对象Index {#索引对象index}1. Series和DataFrame中的索引都是Index对象2. 索引对象不可变,保证了数据的安全常见的Index种类Series索引 {#series索引}1. index 指定行索引名2. 行索引3. 切片索引4. 不连续索引5. 布尔索引DataFrame索引1. columns 指定列索引名2. 列索引3. 不连续索引高级索引

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 6万+

Autosar MCAL-S32K324 Fee配置-基于EB

Autosar MCAL S32K324 Fee配置详解

赞的博客 1544

字典树Trie

字典树字典树——Trie树,又称为前缀树(Prefix Tree)、单词查找树或键树,是一种多叉树结构。

一只程序猿 9728

YOLOv11改进 | 融合改进篇 | 利用尺度统一检测头DynamicHead融合P2增加小目标检测层(让小目标无所遁形)

本文给大家带来的最新改进机制是针对性的改进,针对于小目标检测增加P2层针对于大目标检测增加P6层利用DynamicHead(原版本一比一复现,全网独一份,不同于网上魔改版本)进行检测,其中我们增加P2层其拥有更高的分辨率,这使得模型能够更好地捕捉到小尺寸目标的细节。我们增加P6层是一个较低分辨率但具有更大感受野的特征层。对于大尺寸目标,这意味着模型可以更有效地捕捉到整体的结构信息。在这些的基础上我们配合DynamicHead可以使模型根据不同尺寸的目标动态调整其检测策略,进一步提升模型的精度。

Snu77的博客 3941

字典树(Trie/前缀树)

Trie 字典树 前缀树

good good study, day day up! 7866

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Trie字典树详解

Trie树,又叫字典树,前缀树(Prefix Tree),单词查找树,是一种多叉树的结构.上图就是一颗Trie树,表示了关键字集合根节点不包含字符,除根节点外每一个节点都只包含一个字符从根节点到某一节点,路径上的字符连接起来,为该节点对应的字符串每个节点的所有子节点包含的字符都不相同.算法核心:利用字符串的公共前缀来减少查询时间,最大限度的减少无畏字符串的比较.单词检索统计和排序字符串字符串前缀搜索我们来看一个场景:当我们在浏览器的搜索框中打出一个字符串的前缀时,它便实时的单词自动补齐.对于。

smf12138的博客 2322

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

字典树(Trie) 详解

字典树(Trie),又称为或,是一种用于高效和字符串集合的数据结构,特别适合处理大量字符串的前缀匹配问题。它是一种结构,每个节点代表一个字符串的字符。以为例。下面是一个简单的的实现。它代表中的一个节点,用于存储字符和状态信息。依次插入 “apple”, “bana”​。

qq_55264624的博客 1718

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Trie字典树

Trie字典树和我们以前学的树结构不同,他是直接从根节点遍历到叶子节点,这样重复就完成了字典树 每个节点有若干个指向下一个节点的指针,考虑不同的语言,不同的情境。我们要有一个判断单词,还有从一个节点到下一个节点的映射具体的实现代码如下: private class Node{ public boolean isWord; public TreeMap<Character,Node&g...

DramaLifes的博客 316

字典树-Trie详解

算法竞赛

cql666555的博客 1644

Trie(字典树)

本文主要介绍了 Trie(前缀树/字典树)这一高效存储和检索字符串集合的树形数据结构,并给出相关实现~

2201_75479723的博客 1208

Trie树(字典树)

Trie树,又叫字典树前缀树(Prefix Tree)单词查找树或键树,是一种多叉树结构。如下图:上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”}。根节点不包含字符,除根节点外的每一个子节点都包含一个字符。从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符互不相同。通常在实现的时候,会在节点结构中设置一个标志,用来标记该结点处是否构成一个单词(关键字)。

2301_80224556的博客 2781

数据结构之字典树Trie

文章目录Trie 字典树 前缀树什么是Trie基本概念基本性质应用场景优点手写一个trieTrie字典树的前缀查询实现Trie(前缀树) LeetCode208添加与搜索单词 - 数据结构设计LeetCode 211键值映射LeetCode677 Trie 字典树 前缀树 什么是Trie 基本概念 字典树,又称为单词查找树,Trie树,是一种树形结构,它是一种哈希表的变种。 基本性质 根节点...

qq_24095055的博客 723

字典树·Trie

Trie是一种高级的数据结构,用来统计多个字符串的查找,由于查找方式和内容和字典很想,所以被称为字典树 所以——只要你会查字典,你就会trie 来看一张图 我们现在这里有一个字典如上图,那么在字典里我们想把一个词给插进去,要怎么做呢,比如我们插入“清华园”,那么我们就先找“清”字,再找“华”,但是没有园,所以我们在华下面连到园 所以trie的插入和这个差不多,每次去找下一个字符,如果没有就建一个...

NephrenRuqInsania 251

Trie字典树入门+例题详解

字符串算法的总结到了Trie字典树这里,个人感觉Trie字典树不难,无论是思想还是代码部分,都是很容易理解的,但是作为AC自动机的前置知识,我们还是要好好学习一下的。 简介 字典树,也称 Trie 或字母树,指的是某个字符串集合对应的形如下图所示的有根树。树的每条边上恰好对应一个字符,每个顶点代表从根到该结点的路径所对应的字符串(将所有经过的边上的字符按顺序连接起来)。有时我们也称 Trie 上的边为转移,顶点为状态。 字符串集合{“AAA” “AAG” “T” “TCA” “TG”} 顶点上还能存储.

hhhcbw的博客,欢迎各位来访 864

Trie树 -- 高效的字典树

Trie树即"字典树",是一种从字符串集合中快速匹配另一个字符串集合的算法.

My vegetable has exploded. 2103
上一篇: BFS(广度优先搜索)记忆搜索(三)
下一篇: Little By Little( 一 )
Re:fused
博客等级 码龄9年 474粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值