C++自定义字典树结构

news2024/11/14 15:32:26
代码 
#include <iostream>
using namespace std;

class TrieNode
{
public:
    char data;
    TrieNode* children[26];
    bool isTerminal;

    TrieNode(char ch)
    {
        data = ch;
        for (int i = 0; i < 26; i++)
        {
            children[i] = NULL;
        }
        isTerminal = false;
    }
};
class Trie
{
public:
    TrieNode* root;
    Trie()
    {
        root = new TrieNode('\0');
    }
    void insertUtil(TrieNode* root, string word)
    {
        // base case
        if (word.length() == 0)
        {
            root->isTerminal = true;
            return;
        }
        // assumption , world will be CAPS
        int index = word[0] - 'A';
        TrieNode* child;
        // present
        if (root->children[index] != NULL)
        {
            child = root->children[index];
        }
        else
        {
            // absent
            child = new TrieNode(word[0]);
            root->children[index] = child;
        }
        // RECURSION
        insertUtil(child, word.substr(1));
    }
    void insertWord(string word)
    {
        insertUtil(root, word);
    }
    bool searchUtil(TrieNode* root, string word)
    {
        // base case
        if (word.length() == 0)
        {
            return root->isTerminal;
        }
        int index = word[0] - 'A';
        TrieNode* child;
        // present
        if (root->children[index] != NULL)
        {
            child = root->children[index];
        }
        else
        {
            // absent
            return false;
        }
        // RECURSION
        return searchUtil(child, word.substr(1));
    }
    bool searchWord(string word)
    {
        return searchUtil(root, word);
    }
};


#include <bitset>
#include <unordered_map>
#include <vector>
template <std::size_t N>
using Signature = std::bitset<N>;

// util function to split string into parts by given delimiter.
static void split(std::string_view s, std::vector<std::string>& parts, char delimiter) {
    parts.emplace_back();
    for (auto ch : s) ch == delimiter ? parts.push_back("") : parts.back().push_back(ch);
};

// A MyTrie structures ids by names into a tree.
template <std::size_t N>
class MyTrie {
private:
    // Signature of all signals under this tree.
    // e.g. the node `b` matches all "a.b.*"
    Signature<N> signature;
    // Child tries.
    std::unordered_map<std::string, MyTrie*> children;
    // If it's a end node of a signal's name, the signal id of which.
    size_t id = 0;
    char m_delimiter;

public:
    MyTrie(char delimiter = '.') : m_delimiter(delimiter){}
    ~MyTrie() {  // free every child recursively
        for (auto p : children) delete p.second;
    }
    // Puts a signal id onto this tree by signal name.
    void Put(std::string_view name, size_t id) {
        std::vector<std::string> parts;
        split(name, parts, m_delimiter);
        auto t = this;  // t is the node walked through
        for (const auto& p : parts) {
            // Creates a node if not exist.
            if (auto [it, inserted] = t->children.try_emplace(p, nullptr); inserted) it->second = new MyTrie();
            // Mark this signal id to its signature.
            t->signature[id] = 1;
            t = t->children[p];
        }
        // The last node.
        t->id = id;
    }
    // Match signals by given pattern, returns a signature of matched signal ids.
    Signature<N> Match(std::string_view pattern) const {
        Signature<N> sig;
        std::vector<std::string> parts;
        split(pattern, parts, m_delimiter);
        auto t = this;
        for (const auto& p : parts) {
            // matches all under the subtree
            if (p == "*")
                return t->signature;
            else {  // match by exact name
                // match failure, returns empty signature
                if (t->children.find(p) == t->children.end()) return sig;
                t = t->children.at(p);
            }
        }
        // The last node, matches a single signal.
        sig[t->id] = 1;
        return sig;
    }
};

int test()
{
    // 基础添加查找,单个字符为一组,进行字符串词典构建
    Trie* t = new Trie();

    t->insertWord("ARM");
    t->insertWord("DO");
    t->insertWord("TIME");
    cout << "Present or Not " << t->searchWord("TIM") << endl;  // Present or Not 0
    cout << "Present or Not " << t->searchWord("TIME") << endl; // Present or Not 1
    
    // 扩展模式匹配,单个字符串为一组,进行字符串词典构建
    MyTrie<1024> trie;
    trie.Put("ab.cd.ef", 1);
    trie.Put("ab.cd.kk", 2);
    trie.Put("ab.xy.zz", 3);
    trie.Put("tt.xx", 4);
    trie.Put("ab.cd", 5);

    auto m1 = trie.Match("ab.cd.ef");   // m1.count() == 1
    auto m2 = trie.Match("ab.cd.*");   // m2.count() == 2

    // 字体查找
    MyTrie<1024> fontlist(' ');
    std::vector<std::string> familys = {"Noto Sans SC", "Noto Sans ", "Noto Sans Regular", "Noto Sans Bold", "Noto Sans Italic"};
    int i = 0;
    for (const auto& family : familys) {
        fontlist.Put(family, i++);
    }
    auto findList = fontlist.Match("Noto Sans *");
    for (int i = 0; i < familys.size(); i++) {
        if (findList[i]) {
            std::cout << familys[i] << std::endl;
        }
    }
    return 0;
}
输出

Present or Not 0
Present or Not 1
Noto Sans SC
Noto Sans
Noto Sans Regular
Noto Sans Bold
Noto Sans Italic


创作不易,小小的支持一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1945166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer和预训练模型是什么

目前我们使用的OpenAI的ChatGPT是一种基于GPT-3.5或GPT-4的聊天机器人&#xff0c;能够实现人与机器之间的自然语言交互。那么GPT是什么呢&#xff1f; GPT是一种语言模型&#xff0c;它是由OpenAI实验室于2018年推出的基于Transformer架构的预训练语言模型&#xff0c;通过处理…

matlab y = 1/√x图像和y = 1/x图像

matlab y 1/√x图像和y 1/x图像 y 1/√x与y 1/x绘制结果y√x y 1/√x与y 1/x clc, clear, close all; length 3; axis_len 5;% Create a range of x values x linspace(0.01, length^2, 1000); % Avoid x 0 for 1/√x% Compute the corresponding y values y1 1 .…

2024.7.23(DNS正向解析)

回顾&#xff1a; # 安装 samba yum -y install samba # 自建库&#xff0c;只下载&#xff0c;不安装 yum -y install --downloadonly --downloaddir./soft/ # 配置samba vim /etc/samba/smb.conf # 配置 [xxxxxxxname] commentdasdffsffdslfdjsa path/share …

hadoop大数据安全管理:ldap、keberos、ranger

hadoop大数据中认证一般用keberos&#xff0c;授权用ranger&#xff0c;kerberos和Ldap组件共同组成整个集群的安全鉴权体系&#xff0c;Ldap负责用户数据存储。 kerberos Kerberos 是一种网络认证协议&#xff0c;用于在不安全的网络中以安全的方式对用户和服务进行身份验证。…

05-用户画像+mysql-hive数据导入

将用户数据导入数仓 新建 create_hive_table.sh文件 在终端执行以下文件 sh create_hive_table.sh sqoop create-hive-table \ --connect jdbc:mysql://up01:3306/tags_dat \ tags_dat库名 --username root \ root 用户名 --password 123456 \ 123456 密码 --ta…

Vuex数据持久化实现

版本&#xff1a;vue 3.4.29 vuex4.1.0 1. 出现的问题 当我使用 vuex 作为状态管理组件来存储用户的一些信息之后&#xff0c;发现从/login 页面跳转到/home 界面后拿不到vuex信息。 之后查阅资料了解&#xff0c;当切换路由后&#xff0c;vue 会重新渲染&#xff0c;而vuex 也…

Java——————接口(interface) <详解>

1.1 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本电脑上的USB接口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以插&#xff1a;U盘、鼠标、键盘...所有符合USB协议的设备 电源插座插孔上&#xff0c;可以插&#xff…

小程序收银视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

NC65 还款单的冲借款还款金额和报销单中冲借款的还款金额的计算逻辑

被报销单的冲借款界面中还款单金额计算逻辑&#xff0c;困扰了两天&#xff0c;无意中操作了&#xff0c;才搞清楚计算的逻辑&#xff08;感觉有点反人类&#xff09;。明明可以借款金额减去冲借款金额等于还款金额就行了&#xff0c;非得冲借款金额减去报销金额等于还款金额。…

数学基础【俗说矩阵】:逆矩阵

逆矩阵知识 认识逆矩阵 当最矩阵A【左乘】【初等阵】多次&#xff08;也就是进行多次【初等行】变化&#xff09;后&#xff0c;得到了一个【单位阵E】。由于矩阵具有结合律&#xff0c;把矩阵A【左乘】的所有【初等阵】乘起来&#xff0c;就得到了一个新的矩阵。我们称这个能…

Jenkins - apt 安装软件包 404 Not Found

Jenkins - apt 安装软件包 404 Not Found 引言关于 apt解决 apt 安装软件包 404 问题问题分析解决方案 引言 日常 Jenkins job 运行&#xff0c;有段时间会遇到 apt 安装软件包 404 的情况&#xff0c;这种情况不是每次都发生的&#xff0c;但是会导致 Jenkins 失败&#xff0…

强化学习术语与超参数整理(PPO)

最近在isaac lab中使用各个强化学习框架做对比训练&#xff0c;算法都是用的PPO&#xff0c;但是每个框架里超参数名字都不太一样&#xff0c;各种叫法弄得都混乱了&#xff0c;而且对齐不好很难对比出结论&#xff0c;在这里系统整理一下。 Isaac Lab支持的强化学习框架介绍-…

UE4-光照重建

当我们拉入新的光源和模型到我们的场景中后&#xff0c;会产生这样的情况&#xff1a; Preview:预览 表示此时由于光照物体所产生的阴影都是预览级别的并不是真正的效果。 方法一&#xff1a; 或者也可以在世界大纲中选中我们的光源&#xff0c;然后将我们的光源改变为可以…

免费【2024】springboot 毕业生就业管理微信小程序

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

MPI框架以及PIPE数据流向细节

一、海思MPP内部处理流程图 各模块功能介绍&#xff1a; &#xff08;1&#xff09;VI:捕获视频图像&#xff0c;可对其做剪切、缩放、镜像等处理&#xff0c;并输出多路不同分辨率的图像数据. &#xff08;2&#xff09;AI:捕获⾳频数据&#xff0c;然后AENC 模块⽀持按多种⾳…

2024:Qt--编译配置Protobuf(windows10) 配图详解

这里写自定义目录标题 一、准备1、Window10系统2、Qt Creator 5.0.2 Based on Qt 5.15.2 (MSVC 2019, 64 bit)3、protobuf-3.15.0&#xff08;本示例使用版本&#xff09;4、cmake-3.21.3-windows-x86_64&#xff08;本示例使用&#xff0c;下载的zip直接解压使用&#xff09; …

代码随想录——零钱兑换Ⅱ(Leetcode518)

题目链接 完全背包 class Solution {public int change(int amount, int[] coins) {int[] dp new int[amount 1];dp[0] 1;for(int i 0; i < coins.length; i){for(int j coins[i]; j < amount; j){dp[j] dp[j - coins[i]];}}return dp[amount];} }本题为组合问题…

MySQL 约束 (constraint)

文章目录 约束&#xff08;constraint)列级约束和表级约束给约束起名字&#xff08;constraint)非空约束&#xff08;no null)检查约束&#xff08;check)唯一性约束 (unique)主键约束 (primary key)主键分类单一主键复合主键主键自增 &#xff08;auto_increment) 外键约束外什…

【IEEE出版 | 广东省高校联合主办】第六届物联网、自动化和人工智能国际学术会议(IoTAAI 2024,7月26-28)

第六届物联网、自动化和人工智能国际会议&#xff08;IoTAAI 2024&#xff09;将于2024年07月26-28日在中国广州召开。 会议旨在拓展国际科技学术交流渠道&#xff0c;搭建学术资源共享平台&#xff0c;促进全球范围内的科技创新&#xff0c;提升中外学术合作。会议还鼓励不同领…