【算法竞赛】尺取法

尺取法(又称为双指针、Two Pointers)是算法竞赛中一个常)用的优化技巧,用来解决序列的区间问题,操作简单,容易编程。如果区间是单调的,也常常用二分法求解,所以很多问题用尺取法和二分法都行。另外,尺取法的操作过程和分治算法的步骤很相似,有时也用在分治中。

概念

什么是尺取法?为什么尺取法能用来优化?考虑下面的应用背景:
(1)给定一个序列,有时需要它是有序的,先排序;
(2)问题和序列的区间有关,且需要操作两个变量,可以用两个下标(指针)i和j扫描区间。
对于上面的应用,一般的做法是用i和j分别扫描区间,有二重循环,复杂度为O(n2)。
以反向扫描(即i与j的方向相反,后文有解释)为例,代码如下:


for(int i = 0; i<n; i++)                      //i从头扫到尾
	for(intj=n-1; n-1; j>= 0; j-- ){
   
             //j从尾扫到头
			...
		}
	

下面用尺取法优化上述算法。
实际上,尺取法就是把二重循环变为一个循环,在这个循环不中同时处理i和j。复杂度也就从O(n2)变为O(n)。仍以上面的反向扫描为例,代码如下:

//用while实现
int i = 0, j = n - 1;
while (i<j){
   
   
	//i和j在中间相遇,这样做还能防止i和j越界
	i++;//i从头扫到尾
	j--;//j从尾扫到头
}
//用for实现
for(inti= 0, j=n-1;i<j;i++,j--){
   
   
		//满足题意的操作
	}

在尺取法中,i和j有以下两种扫描方向:
(1)反向扫描。i和j方向相反,让i从头到尾,j从尾到头,在中间相会。
(2)同向扫描。i和j方向相同,都从头到尾,速度不同,如让j跑在i前面。

把同向扫描的i、j指针称为"快慢指针",把反向扫描的i、j指针称为"左右指针",更加形象。其中,“快慢指针"在序列上产生了一个大小可变的"滑动窗口”,有灵活的应用,如寻找区间、数组去重、多指针问题。

反向扫描

用下面的几个应用说明反向扫描的编码方法。

一、找指定和的整数对
这个问题是尺取法中最经典,也最简单直接的应用。
在这里插入图片描述
为了说明尺取法的优势,下面给出4种解题方法。
(1)用二重循环暴力搜索,枚举所有的取数方法,复杂度为0(n2),超时。暴力法不需要排序。
(2)二分法。首先对数组从小到大排序,复杂度为O(nlog2n);然后从头到尾处理数组中的每个元素a[i],在大于a[i]的数中二分查找是否存在一个等于m-a[i]的数,复杂度也为O(nlog2n)。两部分相加,总复杂度仍然为O(nlog2n)。
(3)哈希。分配一个哈希空间s,把n个数放进去。逐个检查a[]中的几个数,如a[i],检查m-a[i]在s中是否有值,如果有,那么存在一个答案。复杂度为O(n)。哈希方法很快,但是需要一个额外的很大的哈希空间。
(4)尺取法。这是标准解法。首先对数组从小到大排序;然后设置两个变量i和j,分别指向头和尾,i初值为0,j初值为n-1,然后让i和j逐渐向中间]移动,检查a[i]+a[j],如果大于m,就让j减1;如果小于m,就让i加1,直至a[i]+a[j]=m。排序复杂度为O(nlog2n),检查的复杂度为O(n),总复杂度为O(nlog2n)。
尺取法代码如下,注意可能有多个答案。

// 函数用于找到数组中两数之和等于给定值 m 的两个数
void find_sum(
内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值