p363:rotate的random access iterator版本是怎么一回事?

本文探讨了rotate操作的本质,将其视为元素的左移过程,并通过数学定理解释了在处理序列时可能出现的问题及解决方案。当要求将序列元素左移m位时,通过模运算防止越界,但初始算法可能无法覆盖所有元素。通过最大公因数d,可以确保每个下标被遍历到,从而正确完成旋转操作。
摘要由CSDN通过智能技术生成

1.rotate操作实际上可以看作是左移操作。比如要求将一个序列的前m个元素和后面的元素交换位置,其实相当于将所有元素左移m位,如果移到了头,就自动跳到尾部接着移。

2.于是有这样一种算法,先让第 i i i位元素等于第 i + m i+m i+m位,然后让第 i + m i+m i+m位元素等于第 i + 2 ∗ m i+2*m i+2m位元素。当然这里要使用模操作来应对数组越界。这样就相当于元素左移m位了。

3.但是这样有一个问题,比如对于[a, b, c, d, e, f],要求将所有元素左移两位。我们从 i = 0 i=0 i=0开始,然后 i i i跳到2,再然后跳到4,然后就又跳回了0。经过2所示的过程,我们只是将ace放到了正确的位置,而bdf都没被操作过。

4.有这样一条数学定理,如果n和m的最大公因数是d,那么序列 0 % n 0\% n 0%

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值