[C语言]数组循环位移三种算法--实现与原理

一、问题引入

我们目前有一个一维的数组序列,其中有n个整数(并非绝对,同样可以为字符串,例如基因序列的分析),要求把下标从0到p(包含p,p小于等于n-1)的数组元素平移到数组最后。
在这里插入图片描述
这是一道很明显的数组循环位移问题,其实际应用非常广泛,例如在基因序列分析的特定问题时,我们也要对其中的部分碱基序列进行平移处理。其中实现方法有三种:

  • 1.三次反转法(标准高效)
  • 2.临时数组法
  • 3.暴力排序法

二、算法实现和原理

1.三次反转法

三次反转法是标准的组合数学问题,对一个序列的反转操作是排列的一种基本变换,三次反转法展示了如何将循环移位分解为三个反转的复合。我们先看这个方法的数学原理,再进行原理解释和算法实现。

数学原理

对一一整个序列中的一个片段右移 k 位即是将数组最后 k 个元素与之前的元素整体交换位置。问题的关键是不用辅助空间在线性的时间内利用算法实现这一交换过程。

假设 X,YX, YX,Y 为两个序列,XTX^TXT 代表其反转序列(即 reverse),XYXYXY 代表两个序列的拼接,则有以下两式:
(XT)T=X(X^T)^T = X(XT)T=X

(XY)T=YTXT(XY)^T = Y^T X^T(XY)T=YTXT
由此可见,欲得到目标序列YX只需要对(XY)T(XY)^T(XY)T 再次反转即可,由此可得:

YX=(XTYT)TYX = (X^T Y^T)^TYX=(X

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hui-梦苑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值