首页 > 编程语言 >比较算法(1)

比较算法(1)

时间:2023-05-03 12:45:51浏览次数:33  
标签:sub list 算法 len range 字符串 文本 比较

1、介绍

需求:有时候需要比较两个文本,看有什么异同。

  • 在渗透过程中分析响应变化很实用,可以快速定位不同区域,比如在xss分析过程,或者定位一次性token
  • 另一个场景,是对文件与文件的字节进行比较,用于学习文件结构,以及分析图片木马、加壳、后缀名修改等操作的影响

比较算法,将两个文本分别进行切割成n个子字符串,对应索引的子字符串有四种情况:

  • 作为两个文本的共同子字符串
  • 文本a有,而文本b无,为空字符串
  • 文本a无,为空字符串,而文本b有
  • 文本a和文本b都有,但子字符串不同

通过ui组件对上述四种情况,分别进行颜色标记,以便使用者查看。同时还可以输出在此基础上的统计信息:子字符串个数n,各类型的个数,共同子字符串的总字符数,可以用共同子字符串的个数/总字符串个数或者共同子字符串字数之和*2/(a+b的字符数)表示重复率

2、算法实现

算法核心,是找共同子字符串,并且尽可能长。剩下的自动归为另外三类情形。

(1)两个文本,记为a和b。约定共同子字符串的最小字符长度sub_len_min

(2)a_sub_list和b_sub_list分别记为a和b的结果list

(3)a_range是list[int,int]类型,表示a文本中匹配字符串的开始索引的范围,初始为[0,0]。a_range[0]表示上一个子字符串的结束索引,从a_range[1]是。

类似的,定义b_range

(4)循环

  • 在a中以a_range[1]作为开始索引,截取长度为sub_len_min的子字符串,即a[a_range[1]: a_range[1]+sub_len_min]
  • 在b中从b_range[0]到b_range[1]范围内遍历,是否存在索引为开始索引,长度为sub_len_min的子字符串与a中此时待判断的子字符串相同
  • 如果存在相同,则以此为基础,判断是否存在更长的共同子字符串。最终将最长共同子字符添加到a_sub_list和b_sub_list。需要注意,a和b中共同字符串前的非共同子字符串也需要按序添加到a_sub_list和b_sub_list中
  • 如果不存在相同,则a_range[1]对自身+1,下一次循环再判断
  • 对b重复以上步骤
  • 当a_range[1]==len(a)-min_sub_len或者b_range[1]==len(b)-min_sub_len时,不再循环,而是直接将各自的剩余部分作为子字符串添加。

(5)注意,结果中不会出现同一索引在两个list中同时为空字符串

(6)如果只要其中一个为空字符串,或者其中一个的长度小于sub_len_min,那么直接将两个字符串作为各自的子字符串

3、优化1

上述算法可以称之为整体比较,而在某些场景中,存在按行比较的需求,比如html中,结构是相对固定的,即行数相同。这样可以提高比较的准确性

4、优化2

(1)在a和b中找到最大的共同子字符串,将其各分割为三个子字符串

(2)在剩下的部分继续找最大共同子字符串,类似迭代操作

标签:sub,list,算法,len,range,字符串,文本,比较
From: https://www.cnblogs.com/wd404/p/17368918.html

相关文章

  • 余弦相似度算法进行客户流失分类预测
    余弦相似性是一种用于计算两个向量之间相似度的方法,常被用于文本分类和信息检索领域。具体来说,假设有两个向量A和B,它们的余弦相似度可以通过以下公式计算:其中,dot_product(A,B)表示向量A和B的点积,norm(A)和norm(B)分别表示向量A和B的范数。如果A和B越相似,它们的余弦相似度就越接......
  • 【算法】哈希算法
    1 前言本节我们来看我们常用的哈希算法哈。2  为什么要有哈希假设我们要设计一个系统来存储将员工手机号作为主键的员工记录,并希望高效地执行以下操作:插入电话号码和相应的信息。(插入)搜索电话号码并获取信息。(查找)删除电话号码及相关信息。(删除)我们可以考虑使用以下......
  • 【算法】页面替换算法
    1 前言功能:当缺页中断发生,需要调入新的页面而内存已满时,选择内存当中哪个物理页面被置换。目标:尽可能地减少页面的换进换出次数(即缺页中断的次数)。具体来说,把未来不再使用的或短期内较少使用的页面换出,通常只能在局部原理指导下依据过去的统计数据来进行预测。2  最优页面......
  • 机器学习算法 随机森林学习 之决策树
    随机森林是基于集体智慧的一个机器学习算法,也是目前最好的机器学习算法之一。随机森林实际是一堆决策树的组合(正如其名,树多了就是森林了)。在用于分类一个新变量时,相关的检测数据提交给构建好的每个分类树。每个树给出一个分类结果,最终选择被最多的分类树支持的分类结果。回归则是不......
  • Stoer-Wagner 算法
    刚才可能是有用算法。这次是无用算法。无向图的最小割是最小的边集使得割掉后不连通。Stoer-Wagner算法可以在\(O(n^3)\)复杂度内解决无向图最小割。或者说实际上是\(O(nm\logm)\)。首先有一句废话:对于任意两点\(s,t\),割掉最小割后,或者处于一个连通块,或者处于不同的两个......
  • 06 ETH-挖矿算法
    《区块链技术与应用》课程链接:https://www.bilibili.com/video/BV1Vt411X7JF/?spm_id_from=333.337.search-card.all.click06ETH-挖矿算法目录06ETH-挖矿算法挖矿是保障区块链安全的一个重要手段。Blockchainissecuredbymining.bugbounty(悬赏找漏洞)比特币的挖矿算......
  • 项目实践:我在嵌入式控制上对PID算法的理解
    关于PID算法的碎碎念(我也不知道咋说明)。笔者:czg-bky全文:我在嵌入式控制上对PID算法的理解-czg-bky-博客园(cnblogs.com)......
  • 6 年大厂面试官,谈谈我对算法岗面试的一些看法
    文|不敢透露姓名的Severus和小轶面试官坐在那撇着大嘴的,“咳,给你一机会,最短的时间内让我记住你。”这个我会,我抡圆了“啪!”,扭头我就走。我刚到家,录取通知书就来了,请你务必马上来一趟。——出自郭德纲的相声大家好,我是Severus,一个在某厂做中文文本理解的程序员。同时,也感谢小轶......
  • 分别使用SAD匹配,NCC匹配,SSD匹配三种算法提取双目图像的深度信息
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要       深度学习的蓬勃发展得益于大规模有标注的数据驱动,有监督学习(supervisedlearning)推动深度模型向着性能越来越高的方向发展。但是,大量的标注数据往往需要付出巨大的人力成本,越来......
  • 结构体内嵌比较函数bool operator < (const node &x) const {}
    structnode{intl,r;booloperator<(constnode&a)const{returnr<a.r;}}a[maxn];使用sort时,如果这么定义节点,说明节点要按照从小到大排序(sort中默认从小到大排序);但是同样的代码,如果使用优先队列,这么写就说明节点要按照从大到小排序(优先队列默......