首页 > 编程语言 >【算法】前缀树

【算法】前缀树

时间:2024-10-30 15:35:42浏览次数:5  
标签:前缀 idx 异或 son 算法 字符串 节点

基本内容

以树的方式存储字符串的数据结构,方便字符串的查找及判断是否为某一字符串的前缀

题目要求:判断一组字符串中是否存在某一字符串是另一字符串的前缀。例如在{“911”, “91140”,“20”,“912”}中,“911”是“91140”的前缀

  • 基本思想

将字符串的每一个元素视为一个节点,例如“911”中将“9”,“1”,“1”视为不同的节点。依次将所有字符串元素进行存储。

  • 变量解释

    ❗ ❗ ❗ 一个元素就是一个节点,只有不同字符串的元素重复路径的时候才属于同一节点

    N:记录一共最多可能有多少个节点;

    son:二维数组,son[N] [10],记录所有节的子节点的索引号idx,第二列为10是因为数字节点的子节点最多是10个,若是字母字符串的话应该是son[N] [26]

    cnt:记录第idx个节点是否为某一字符串的结尾节点

    idx:当前的节点索引号(节点通过数组存储)

  • 核心代码

strs = ["911", "91140", "20", "912"]
for s in strs:
    p = 0 # 表示头节点
    for i in range(len(s)):
        if son[p][int(s[i])] == 0: # 为0表示当前没有该节点,idx为该节点的索引
            idx += 1
            son[p][int(s[i])] = idx
        p = son[p][int(s[i])] # 更新p为下一元素的节点索引
        
        # 判断是否为其他字符串的前缀的两种情况
        # ① 当前节点是其他字符串的结束节点 ② 其他字符串的节点是当前字符串的结束节点
		if cnt[p] != 0 or (i == len(s) - 1 and son[p][int(s[i])] != 0):
            flag = True
            print("NO")
            break
    cnt[p] += 1 # 以索引号为p的节点结尾的字符串加1,可以统计有多少个相同字符串
if not flag:
    print("YES")
  • 总结
  1. 前缀树是一种以空间换时间的数据结构
  2. cnt 数组不仅仅可以用于记录是否为字符串的结束节点,还可以记录相同字符串的个数

题目

  1. P10471 最大异或对 The XOR Largest Pair - 洛谷 | 计算机科学教育新生态

要求:在一组数找到两个数的最大异或值,以长度为3的数字为例子,当与“001”配对的能达到最大异或值的数字为“110”,即为反码

思路:从最高位开始,尽量找到与当前位数为反码的

例子:在["001","101","100","111"] 中找到与 “111” 最大的异或对,从最高位开始,存在依次与11互为反码的00节点,但在该路径中到了第三层不存在与1互为反码的0节点,因此只能继续选择 1 节点,因此最后能与111组成的最大异或对为001.

标签:前缀,idx,异或,son,算法,字符串,节点
From: https://www.cnblogs.com/DLShark/p/18515913

相关文章

  • 基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) BO优化前 BO优化过程 BO优化后  2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)MBsize=32;Lr=0.1;%CNNLSTM构建卷积神经网络laye......
  • 安全帽检测视频分析网关算法定制安全帽检测算法的原理及应用
    安全帽在建筑和制造业等企业的生产活动中扮演着至关重要的劳动保护角色,其佩戴情况的实时监控是企业安全生产管理的关键组成部分。以往依赖人工巡检的安全监管方式不仅效率低,而且难以实现全面监督。应用安全帽检测视频分析网关,安全监管已经从被动式监察转变为主动式监控,利用技术手......
  • AI智能分析视频分析网关算法定制AI赋能视频监控技术的进化之路
    随着人工智能(AI)技术的快速进步,其在众多领域的应用日益广泛,特别是在视频监控行业中表现出了强大的潜力和显著的价值。AI视频监控技术不仅增强了监控系统的智能化程度,还显著提高了安全管理的效率与精确度。本文将详细讨论AI智能分析视频分析网关的关键技术和在各个领域的应用情况。......
  • C++算法练习-day26——239.滑动窗口的最大值
    题目来源:.-力扣(LeetCode)题目思路分析题目:给定一个整数数组 nums 和一个整数 k,请找出该数组中所有长度为 k 的子数组中的最大元素,并返回这些最大元素组成的数组。思路:滑动窗口:这是一个典型的滑动窗口问题,其中窗口的大小为 k。我们需要遍历整个数组,同时保持一......
  • C++算法练习-day27——347.前k个高频元素
    题目来源:.-力扣(LeetCode)题目思路分析题目:找出数组中出现频率最高的前K个元素。这个问题要求我们从给定的数组nums中找出频率最高的前k个元素。这通常意味着我们需要统计每个元素的出现次数,然后根据这些次数进行排序,并提取前k个元素。以下是解决这个问题的思路:统计频率:首......
  • 算法学习笔记5: 排序算法
    排序算法归并排序时间复杂度O(nlogn)空间复杂度O(n),稳定排序就是给定两个有序数组,将两个数组合并在一起升序。定义一个更大的数组,给定两个指针分别指向两个数组,每次取较小值放入新数组。voidmergeSort(inta[],intl,intr){ if(l>=r)return; intmid=l+r>>1;......
  • 算法学习笔记6: 字符串
    字符串字符串哈希通过求解字符串前缀的哈希值的方式,可以比较字符串内任意字串的相等情况。首先需要把每个字符映射成数字,是什么无所谓(因为字符不好计算哈希值呀),然后类似于计算前缀和的方式,这里是计算h[i]表示前i个字符的哈希值。然后把要计算的每个前缀字符串看作是一个P......
  • 快速排序算法
    快速排序算法是一种高效的排序算法,由C.A.R.Hoare在1960年提出。它的基本思想是分而治之,通过一趟排序将待排序的元素分割成两个部分,其中一部分的所有元素都比另一部分的所有元素小,然后递归地对这两部分继续进行排序操作,整个排序过程可以递归进行,以达到整个数据变成有序序列。快......
  • 代码随想录算法训练营第十三天
    1二叉树的理论基础文章链接:代码随想录视频链接:关于二叉树,你该了解这些!|二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序_哔哩哔哩_bilibili1.1二叉树的种类满二叉树所有节点处的值都排满了,没有空的完全二叉树只有在最后一......
  • 基于模型预测算法的混合储能微电网双层能量管理系统研究(Matlab代码实现)
      ......