一、问题引入
我们目前有一个一维的数组序列,其中有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


1179

被折叠的 条评论
为什么被折叠?



