编程之美读书笔记_2.17 数组循环移位

2.17 数组循环移位

对长度为 n 的数组 (ab) 左移 k 位,最直接的方法,就是用 stl rotate 函数( stl 针对三种不同的迭代器,提供了三个版本的 rotate )。但在某些情况下,用 stl rotate 效率极差。对数组循环,可以采用:

     动态分配一个同样长度的数组,将数据复制到该数组并改变次序,再复制回原数组。

     利用 ba=(br )r (ar )r =(ar br )r ,通过三次反转字符串。

分组交换(尽可能使数组的前面连续几个数为所要结果):

a 长度大于 b ,将 ab 分成 a0 a1 b ,交换 a0 b ,得 ba1 a0 ,只需再交换 a1 a0

a 长度小于 b ,将 ab 分成 ab0 b1 ,交换 a b0 ,得 b0 ab1 ,只需再交换 a b0

通过不断将数组划分,和交换,直到不能再划分为止。分组过程与求最大公约数很相似。

所有序号为 (i+t*k) % n (i 为指定整数, t 为任意整数 ) ,会构成一个循环链(共有 gcd(n,k) 个, gcd n k 的最大公约数),每个循环链上的元素只要移动一个位置即可,总共交换了 n 次。

stl rotate 的三种迭代器,分别使用了后三种方法。

多数情况下,前三种方法效率都比较高,第一种方法过分要求内存,第四种方法,元素间平均交换次数最少,理论上效率应该是最高的,但在 n k 都很大时,其效率相当差(由于每次交换访问的内存不连续,在 n k 比较大时,内存访问开销很大( cache line 命中率很低,又不断跨页访问内存)。)。方法三的平均交换次数要少于方法二,但判断次数相对要多,效率相差不是太大,在大数组时方法三效率比较高,但同一个小数组左移几十万次,应该是方法二效率略高,毕竟整个数组都可以被 cache ,内存访问开销小,判断次数对效率影响较大。

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值