内存移动算法

本文介绍了如何实现高效地对包含K个元素的数组进行循环左移和右移m位的算法,要求不额外申请数组空间。通过数学分析,得出移动元素的新位置公式并利用最大公约数确定递归过程的步长,最后给出O(n)时间复杂度和O(1)空间复杂度的解决方案。同时提供了求最大公约数的辅助函数。
摘要由CSDN通过智能技术生成

原文参见《程序员》杂志2006年第6期。现对原文做部分摘录,并给出自己的算法。

    问题: 对于有K个元素的数组int a[k]={.......};写一个高效算法将数组内容循环左移m位,
比如:int a[6]={1,2,3,4,5,6},循环左移3位后得到结果{4,5,6,1,2,3}.
    要求:1.不允许另外申请数组空间,但可以申请少许变量;
         2.不允许采用每次左移。
    最直观的想法,就是从第一个元素开始,把他一步移动到最终目的位置,而该位置原有的元素的值取出,移动到它的新位置。递归进行这个步骤。
    首先,我们在数学上很容易理解,这是一个一一对应映射,绝不会在一个位置上出现两次移动。所以不会出现移动的递归过程中途指向了已经移动过的元素。
    那么,这个递归过程唯一的终止条件就是,当前移动的元素,目的位置就是移动过程的起始位置。
    如果按照元素的索引下标标示元素,0到k-1中的任意元素i,会移动到什么位置?
    对于任意的i,它的新位置i'=((k-m) + i)%k.
    那么,我们可以定义这个循环链,取整数i0,使得0=<i0<m,定义i1=((k-m) + i0)%k,i2=((k-m) + i1)%k....ix=((k-m) + ix-1)%k.当ix=i0时循环终止。此时有i0=ix=((k-m) + ix-1)%k=....
=(x(k-m) + i0)%k
    因为我们知道0<i0<m,所以有0=x(k-m)%k,也就是说࿰

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值